110 likes | 279 Views
YACC Primer. CS 671 January 29, 2008. Yacc. Y et A nother C ompiler C ompiler Automatically constructs an LALR(1) parsing table from a set of grammar rules Yacc/Bison specification:. file.y. parser declarations %% grammar rules %% auxiliary code. bison –vd file.y -or-
E N D
YACC Primer CS 671 January 29, 2008
Yacc • Yet Another Compiler Compiler • Automatically constructs an LALR(1) parsing table from a set of grammar rules • Yacc/Bison specification: file.y parser declarations %% grammar rules %% auxiliary code bison –vd file.y -or- yacc –vd file.y y.tab.c y.tab.h y.output
Yacc/Bison • Input: A CFG and a translation scheme – file.y • Output: A parser file.tab.c (bison) or y.tab.c (yacc) • An output file file.output containing the parsing tables (when invoked with –v option) • A file file.tab.h containing declarations (if invoked with –d option) • The parser called yyparse() • Parser expects to use a function called yylex() to get tokens
Yacc Declaration Section • % { • c code • % } • % token PLUS MULTIPLY DIVIDE • % left PLUS MINUS • % left MULT DIV • % nonassoc EQ NEQ LT GT • % prec UMINUS Terminal symbols Assigned enum Placed in f.tab.h
Yacc Grammar Rules Section • exp : exp PLUS exp { semantic action } C code. Executed when parser reduces this rule Non-terminal Terminal
Example Grammar • P L • S id := id • S while id do S • S begin L end • S if id then S • S if id then S else S • L S • L L ; S
Corresponding Yacc Specification • %{ • int yylex(void); • %} • % token ID WHILE BEGIN END DO … • % start prog • %% • [please fill in • your solution] P L S id := id S while id do S S begin L end S if id then S S if id then S else S L S L L ; S
Conflicts • Yacc reports shift-reduce and reduce-reduce conflicts • Default behavior: • shift/reduce: choose shift • reduce/reduce: uses earlier rule • State 17: shift/reduce conflict • (shift ELSE, reduce 4) • stm: IF ID THEN stm . • stm: IF ID THEN stm . ELSE stm • ELSE shift 19 • . reduce by rule 4 • Resolve all conflicts!! (Use precedence rules)
Must Manage Conflicts • % left PLUS; • % left TIMES; // TIMES > PLUS • E : E PLUS E | E TIMES E | ... E→ E . + E … E→ E E . + • Rule: in conflict, choose reduce if production symbol higher precedence than shifted symbol; choose shift if vice-versa E→ E + E . E→ E . E …
Precedence Directives • E E * E . + • E E . + E (any) %nonassoc EQ NEQ %left PLUS MINUS %left TIMES DIV %right EXP E E E E E + E * %left prefers reducing %right prefers shifting %nonassoc error E + E E * E shift reduce
The %prec Directive • %{ declarations of yylex and yyerror %} • % token INT PLUS MINUS TIMES UMINUS • % start exp • % left PLUS MINUS • % left TIMES • % left UMINUS • %% • exp : INT • | exp PLUS exp • | exp MINUS exp • | exp TIMES exp • | MINUS exp %prec UMINUS