YACC Primer CS 671 January 29, 2008
CS 671 – Spring Yacc Yet Another Compiler Compiler Automatically constructs an LALR(1) parsing table from a set of grammar rules Yacc/Bison specification: parser declarations % grammar rules % auxiliary code bison –vd file.y -or- yacc –vd file.y y.tab.c y.tab.h y.output file.y
CS 671 – Spring 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
CS 671 – Spring 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
CS 671 – Spring Yacc Grammar Rules Section exp : exp PLUS exp { semantic action } Non-terminal Terminal C code. Executed when parser reduces this rule
CS 671 – Spring 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
CS 671 – Spring 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
CS 671 – Spring 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)
CS 671 – Spring Must Manage Conflicts % left PLUS; % left TIMES; // TIMES > PLUS E : E PLUS E | E TIMES E |... E → E. + E … E → E 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
CS 671 – Spring Precedence Directives E E * E. + E E. + E (any) E EE EE+ * E +E EE* E shiftreduce %nonassoc EQ NEQ %left PLUS MINUS %left TIMES DIV %right EXP %left prefers reducing %right prefers shifting %nonassoc error
CS 671 – Spring 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