컴파일러

Similar documents
商用

OCW_C언어 기초

Microsoft PowerPoint - semantics

untitled

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

lex-yacc-tutorial.hwp

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

K&R2 Reference Manual 번역본

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음


[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

3장 어휘분석

EA0015: 컴파일러

C 언어 프로그래밊 과제 풀이

untitled

02장.배열과 클래스

Semantic Consistency in Information Exchange

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

중간고사

Microsoft PowerPoint - chap12-고급기능.pptx

본 강의에 들어가기 전

Microsoft PowerPoint - ch07 - 포인터 pm0415

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - Chapter_04.pptx


목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

untitled

11장 포인터


<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

Microsoft PowerPoint - chap05-제어문.pptx

슬라이드 1

Microsoft PowerPoint - chap03-변수와데이터형.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

KNK_C_05_Pointers_Arrays_structures_summary_v02

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

C++-¿Ïº®Çؼ³10Àå

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

chap 5: Trees

(3) Windows 운영체제에 GNU C 컴파일러와 Flex, Bison 설치하기 적용된 Windows 운영체제는 32비트용 Windows 7이나, 다른버전에서도유사할것으로본다. 먼저 GNU C 컴파일러를설치한다. 이것을설치하는편한방법중하나가유명한무료 C/C++ 프로

5.스택(강의자료).key

OCW_C언어 기초

chap10.PDF

PowerPoint Presentation

Microsoft PowerPoint - chap10-함수의활용.pptx

C 프로그래밊 개요

PowerPoint 프레젠테이션

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap-11.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

chap8.PDF

1장. 유닉스 시스템 프로그래밍 개요

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

untitled

OCW_C언어 기초

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

윤성우의 열혈 TCP/IP 소켓 프로그래밍

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

1. 27 (token descriptions) (regular expressions), grep egrep.. C. 1),., C (expressions), (statements), (declarations), (blocks) (procedures). (parsing

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

untitled

11장 포인터

/chroot/lib/ /chroot/etc/

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - 제11장 포인터(강의)

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제11장 포인터

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - Chapter_08.pptx

Microsoft PowerPoint - [2009] 02.pptx

기초컴퓨터프로그래밍

Microsoft PowerPoint - lab14.pptx

03장.스택.key

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

untitled

제4장 기본 의미구조 (Basic Semantics)

, ( ),, ( ), 3, int kor[5]; int eng[5]; int Microsoft Windows 4 (ANSI C2 ) int kor[5] 20 # define #define SIZE 20 int a[10]; char c[10]; float

Microsoft PowerPoint - Chapter_09.pptx

ABC 2장

강의10

13주-14주proc.PDF

C 프로그래밊 개요

쉽게 풀어쓴 C 프로그래밍

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

Transcription:

YACC 응용예 Desktop Calculator 7/23

Lex 입력 수식문법을위한 lex 입력 : calc.l %{ #include calc.tab.h" %} %% [0-9]+ return(number) [ \t] \n return(0) \+ return('+') \* return('*'). { printf("'%c': illegal character\n", yytext[0]) exit(-1) }

Yacc 입력 수식문법을위한 yacc 입력 : calc.y %{ #include <stdio.h> %} %token NUMBER %% Exp : Exp '+' Term { printf("rule 1\n") } Term { printf("rule 2\n") } Term : Term '*' Num { printf("rule 3\n") } Num { printf("rule 4\n") } Num : NUMBER { printf("rule 5\n") }

실행 UNIX 명령어 % gedit calc.l % gedit calc.y % flex calc.l % bison -d calc.y % gcc -o calc lex.yy.c calc.tab.c -ly ll % gedit input %./calc < input

확장 - 0 입력 하나의식 입력의끝은 $ 문자로표현 빼기 (-), 나누기 (/), 그리고괄호연산지원 출력 입력된식의계산결과를출력

Lex 입력 %{ #include <stdlib.h> #include calc.tab.h extern int yylval %} %% [0-9]+ {yylval = atoi(yytext) return(number)} [ \t] $ {return 0 /* end of input */ } \n. {return(yytext[0]) }

%{ #include <stdio.h> %} %token NUMBER %% Yacc 입력 Goal: Exp {printf( =%d\n, $1)} Exp : Exp + Term {$$=$1+$3} %{ Exp - Term {$$=$1-$3} Term {$$=$1} Term : Term '*' Fact {$$=$1*$3} Term / Fact {$$=$1/$3} Fact {$$=$1} Fact: NUMBER {$$=$1} ( Exp ) {$$=$2}

입력 확장 - 1 하나의식에서여러개의식으로확장 한줄에하나의식 출력 입력된식의계산결과를출력

Lex 입력 %{ #include <stdlib.h> #include calc.tab.h extern int yylval %} %% [0-9]+ {yylval = atoi(yytext) return(number)} [ \t] $ {return 0 /* end of input */ } \n. {return(yytext[0]) }

Yacc 입력 %{ #include <stdio.h> %} %token NUMBER %% ExpList: ExpList Exp \n {printf( =%d\n, $2)} Exp \n {printf( =%d\n, $1)}

Yacc 입력 Exp : Exp + Term {$$=$1+$3} Exp - Term {$$=$1-$3} Term {$$=$1} Term : Term '*' Fact {$$=$1*$3} Term / Fact {$$=$1/$3} Fact {$$=$1} Fact: NUMBER {$$=$1} ( Exp ) {$$=$2}

확장 - 2 입력 변수지원, 단변수이름은하나의소문자 입력되는식에변수에대한배정도포함 피연산자는실수도가능 출력 입력된식들의계산결과를출력 배정문일경우, 배정되는값은출력하지않는다.

확장 2 의예 입력 a = 10.0 a+1 b = a+10 b+a 출력 11.0 30.0

변수를어떻게처리? 가능한변수의수는 26 개임 크기 26 인배열을사용 인덱스 0 에는변수 a 의값, 인덱스 1 에는변수 b 의값,. 어휘분석단계에서변수를인식하면, 토큰 Name 의값으로변수에대한인덱스를전달 double vbltables[26] a b c d e f g h 0 1 2 3 4 5 6 7

토큰의값 토큰의값 yylval 을통하여파서에게전달 토큰값의타입 yylval의타입 YYSTYPE 여러타입의값을허용하려면 C: union을사용 Yacc: %union을사용

토큰값의종류 정수, 실수, 스트링, %union 여러타입의토큰을파서에게전달 Yacc 에서토큰의타입을정의 %union { double dval int vblno } 각토큰의타입을지정 %token <vblno> NAME %token <dval> NUMBER

문법기호의타입 %union 에서정의 %type 을이용하여지정 문법기호의타입 예 %union { double dval struct symtab *symp } %token <symp> NAME %token <dval> NUMBER %type <dval> expression

Lex 입력 %{ #include <stdlib.h> #include calc.tab.h extern double vbltables[26] %} %% ([0-9]+ [0-9]*\.[0-9]+) {yylval.dval = atof(yytext) return(number)} [ \t] [a-z] {yylval.vblno = yytext[0]- a return NAME} $ {return 0 /* end of input */ } \n. {return(yytext[0]) }

Yacc 입력 %{ #include <stdio.h> double vbltables[26] %} %union { double dval int vblno } %token <vblno> NAME %token <dval> NUMBER %type <dval> Fact Term Exp %%

Yacc 입력 StmtList: StmtList Stmt \n Stmt \n Stmt : NAME = Exp {vbltables[$1] = $3} Exp {printf( =%f\n, $1)} Exp : Exp + Term {$$=$1+$3} Exp - Term {$$=$1-$3} Term {$$=$1} Term : Term '*' Fact {$$=$1*$3} Term / Fact {$$=$1/$3} Fact {$$=$1} Fact : NUMBER {$$=$1} NAME {$$= vbltables[$1]} ( Exp ) {$$=$2}

변수이름 확장 - 3 Single character multiple characters 예입력출력 input = 10.0 result = input+1 result 11.0 result-input 1.0

Symbol table 심볼테이블의구조 //symbol.h #define NSYMS 20 /* maximum number of symbols */ struct symtab { char double } symtab[nsyms] *name value struct symtab *symlook() 어휘분석 변수를인식하면심볼테이블을검색하여, 심볼테이블항목의주소를리턴 symlook() 함수를이용

symlook() 함수 //look up a symbol table entry, add if not present struct symtab *symlook(char *s) { struct symtab *sp } for(sp=symtab sp < &symtab[nsyms] sp++) { /* is it already here? */ if(sp->name &&!strcmp(sp->name, s)) return sp /* is it free? */ if(!sp->name) { sp->name=strdup(s) return sp } /* otherwise continue to next */ } yyerror( Too many symbols ) exit(1)

Lex 입력 %{ #include <stdlib.h> #include symbol.h #include calc.tab.h %} %% ([0-9]+ [0-9]*\.[0-9]+) {yylval.dval = atof(yytext) return(number)} [ \t] [A-Za-z][A-Za-z0-9]* {yylval.symp = symlook(yytext) return NAME} $ {return 0 /* end of input */ } \n. {return(yytext[0]) }

Yacc 입력 %{ #include symbol.h #include <stdio.h> #include <string.h> %} %union { double dval struct symtab *symp } %token <symp> NAME %token <dval> NUMBER %type <dval> Fact Term Exp

Yacc 입력 %% StmtList: StmtList Stmt \n Stmt \n Stmt : NAME = Exp { $1->value = $3} Exp {printf( =%f\n, $1)} Exp : Exp + Term {$$=$1+$3} Exp - Term {$$=$1-$3} Term {$$=$1} Term : Term '*' Fact {$$=$1*$3} Term / Fact {$$=$1/$3} Fact {$$=$1} Fact : NUMBER {$$=$1} NAME { $$=$1->value} ( Exp ) {$$=$2}

확장 - 4 Allow mathematical functions Such as sqrt(), exp(), log(), 예 입력 s2 = sqrt(2) s2 s2*s2 출력 1.41421 2

Naïve approach In Yacc source %token SQRT LOG EXP %% Term: SQRT ( Exp ) { $$ = sqrt($3) } EXP ( Exp ) { $$ = exp($3) } LOG ( Exp ) { $$ = log($3) } In Lex source You must hardcode functions into parser and lexer Function names are reserved words sqrt log exp return SQRT return LOG return EXP

Reserved Words in Symbol Table 심볼테이블구조 struct symtab { char *name double (*funcptr) () double value } symtab[nsyms] 심볼테이블에예약어저장 main() { extern double sqrt(), exp(), log() addfunc( sqrt, sqrt) addfunc( sqrt, sqrt) addfunc( sqrt, sqrt) yyparse() } void addfunc (char *name, double(*func)( ) ) { struct symtab *sp = symlook(name) sp->funcptr = func }

Reserved Words in Symbol Table In Yacc source %token <symp> NAME FUNC %% Term: FUNC ( Exp ) { $$ = sqrt($3) } In Lex source [A-Za-z][A-Za-z0-9]* { struct symtab *sp = symlook(yytext) } yylval.symp = sp if(sp->funcptr) /* is it a function? */ return FUNC else return NAME