(3) Properties of Context-Free - - PowerPoint PPT Presentation

3
SMART_READER_LITE
LIVE PREVIEW

(3) Properties of Context-Free - - PowerPoint PPT Presentation

(3) Properties of Context-Free Languages (3) kazim@fouladi.ir


slide-1
SLIDE 1

رتويپماك‌و‌قرب‌يسدنهم‌ي‌هدكشناداه‌نيشام‌و‌اه‌نابز‌ي‌هيرظن

‌نتم‌زا‌لقتسم‌ياه‌نابز‌تايصوصخ(3)

Properties of Context-Free Languages (3)

يدلبوف‌مظاك kazim@fouladi.ir رتويپماك‌و‌قرب‌يسدنهم‌ي‌هدكشناد نارهت‌هاگشناد

متشه‌لصف

slide-2
SLIDE 2

2

YACC

Yet Another Compiler Compiler

slide-3
SLIDE 3

3

Yacc is a parser generator Input: A Grammar Output: A parser for the grammar Reminder: a parser finds derivations

slide-4
SLIDE 4

4

Example grammar: The yacc code:

expr : '(' expr ')' | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | - expr | INT ; expr -> ( expr ) | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | - expr | INT ;

slide-5
SLIDE 5

5

Exampe Input: 10 * 3 + 4 Yacc Derivation: expr => expr + expr => expr * expr + expr => 10*3 + 4

slide-6
SLIDE 6

6

Resolving Ambiguities

%left '+', '-' %left '*', '/' %left UMINUS %% expr : '(' expr ')' | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | '-' expr %prec UMINUS | INT ;

slide-7
SLIDE 7

7

Actions

%left '+', '-' %left '*', '/' %left UMINUS %% expr : '(' expr ')' {$$ = $2;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $3;} | expr '*' expr {$$ = $1 * $3;} | expr '/' expr {$$ = $1 / $3;} | '-' expr %prec UMINUS {$$ = -$2;} | INT {$$ = $1;} ;

slide-8
SLIDE 8

8

A Complete Yacc program

%union{ int int_val; } %left '+', '-' %left '*', '/' %left UMINUS %token <int_val> INT %type <int_val> expr %start program %%

slide-9
SLIDE 9

9

program : expr {printf("Expr value = %d \n", $1);} | error {printf("YACC: syntax error near line %d \n", linenum); abort();} ; expr : '(' expr ')' {$$ = $2;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $3;} | expr '*' expr {$$ = $1 * $3;} | expr '/' expr {$$ = $1 / $3;} | '-' expr %prec UMINUS {$$ = -$2;} | INT {$$ = $1;} ; %% #include "lex.yy.c"

slide-10
SLIDE 10

10

Execution Example

10 + 20*(3 - 4 + 25)

Input: Output:

Expr value = 490

slide-11
SLIDE 11

11

The Lex Code

%{ int linenum=1; int temp_int; %} %% \n {linenum++;} [\t ] /* skip spaces */; \/\/[^\n]* /* ignore comments */; "+" {return '+';} "-" {return '-';} "*" {return '*';} "/" {return '/';} ")" {return ')';} "(" {return '(';}

slide-12
SLIDE 12

12

[0-9]+ {sscanf(yytext, "%d", &temp_int); yylval.int_val = temp_int; return INT;} . {printf("LEX: unknown input string found in line %d \n", linenum); abort();}

slide-13
SLIDE 13

13

Compiling: yacc YaccFile lex LexFile cc y.tab.c -ly -ll -o myparser Executable: myparser

slide-14
SLIDE 14

14

Another Yacc Program

%union{ int int_val; } %left '+', '-' %left '*', '/' %left UMINUS %token <int_val> INT %type <int_val> expr %start program %%

slide-15
SLIDE 15

15

program : stmt_list | error {printf("YACC: syntax error near line %d \n", linenum); abort();} ; stmt_list : stmt_list stmt | stmt ; stmt : expr ';' {printf("Expr value = %d \n", $1);} ;

slide-16
SLIDE 16

16

expr : '(' expr ')' {$$ = $2;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $3;} | expr '*' expr {$$ = $1 * $3;} | expr '/' expr {$$ = $1 / $3;} | '-' expr %prec UMINUS {$$ = -$2;} | INT {$$ = $1;} ; %% #include "lex.yy.c"

slide-17
SLIDE 17

17

Execution Example

10 + 20*(30 -67) / 4; 34 * 35 - 123 + -001; 17*8/6;

Input: Output:

Expr value = -175 Expr value = 1066 Expr value = 22

slide-18
SLIDE 18

18

Lex Code

%{ int linenum=1; int temp_int; %} %% \n {linenum++;} [\t ] /* skip spaces */; \/\/[^\n]* /* ignore comments */;

slide-19
SLIDE 19

19

"+" {return '+';} "-" {return '-';} "*" {return '*';} "/" {return '/';} ")" {return ')';} "(" {return '(';} ";" {return ';';} [0-9]+ {sscanf(yytext, "%d", &temp_int); yylval.int_val = temp_int; return INT;} . {printf("LEX: unknown input string found in line %d \n", linenum); abort();}

slide-20
SLIDE 20

20

Another Yacc Program

%union{ int int_val; char *str_val; } %left '+', '-' %left '*', '/' %left UMINUS %token PRINT %token NEWLINE %token <str_val> STRING %token <int_val> INT %type <int_val> expr %start program %%

slide-21
SLIDE 21

21

program : stmt_list | error {printf("YACC: syntax error near line %d \n", linenum); abort();} ; stmt_list : stmt_list stmt | stmt ; stmt : expr ';' {printf("expression found\n");} | PRINT expr ';' {printf("%d", $2);} | PRINT STRING ';' {printf("%s", $2);} | PRINT NEWLINE ';' {printf("\n");} ;

slide-22
SLIDE 22

22

expr : '(' expr ')' {$$ = $2;} | expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $3;} | expr '*' expr {$$ = $1 * $3;} | expr '/' expr {$$ = $1 / $3;} | '-' expr %prec UMINUS {$$ = -$2;} | INT {$$ = $1;} ; %% #include "lex.yy.c"

slide-23
SLIDE 23

23

Execution Example Input:

print "The value of expression 123 * 25 is "; print 123 * 25; print newline; 10 + 5 * 8; print "end of program"; print newline;

Output:

The value of expression 123 * 25 is 3075 expression found end of program

slide-24
SLIDE 24

24

Lex Code

%{ int linenum=1; int temp_int; char temp_str[200]; %} %% \n {linenum++;} [\t ] /* skip spaces */; \/\/[^\n]* /* ignore comments */;

slide-25
SLIDE 25

25

"+" {return '+';} "-" {return '-';} "*" {return '*';} "/" {return '/';} ")" {return ')';} "(" {return '(';} ";" {return ';';} "print" {return PRINT;} "newline" {return NEWLINE;}

slide-26
SLIDE 26

26

[0-9]+ {sscanf(yytext, "%d", &temp_int); yylval.int_val = temp_int; return INT;} \"[^"\n]*\" {strncpy(temp_str, &(yytext[1]), strlen(yytext)-2); temp_str[strlen(yytext)-2] = (char) 0; yylval.str_val = temp_str; return STRING;} . {printf("LEX: unknown input string found in line %d \n", linenum); abort();}