1 yacc parser generator. 2 yacc yacc (yet another compiler compiler) produce a parser for a given...
TRANSCRIPT
![Page 1: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/1.jpg)
1
YACC Parser Generator
![Page 2: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/2.jpg)
2
YACC
YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar.
Compile a LALR(1) grammar Original written by Stephen C. Johnson, 1975. Variants:
lex, yacc (AT&T) bison: a yacc replacement (GNU) flex: fast lexical analyzer (GNU) BSD yacc PCLEX, PCYACC (Abraxas Software)
![Page 3: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/3.jpg)
3
yacc
Generate a new parser code from grammar
YACC source (*.y)
y.tab.hy.tab.c
C compiler/linker
Compile a new parser
y.tab.c a.out
a.out
Parse source code
Token stream
AbstractSyntaxTree
y.output
How Does YACC Work?
![Page 4: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/4.jpg)
4
YACC Format
%{
C declarations
%}
yacc declarations
%%
Grammar rules
%%
Additional C code
![Page 5: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/5.jpg)
5
YACC Example%{#include <stdio.h>%}
%token NAME NUMBER%%
statement: NAME '=' expression | expression { printf("= %d\n", $1); } ;
expression: expression '+' NUMBER { $$ = $1 + $3; } | expression '-' NUMBER { $$ = $1 - $3; } | NUMBER { $$ = $1; } ;%%int yyerror(char *s){ fprintf(stderr, "%s\n", s); return 0;}
int main(void){ yyparse(); return 0;}
C declarations
yacc declarations
Grammar rules
Additional C code
![Page 6: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/6.jpg)
6
YACC Declarations Section
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token ID NUM
%start expr
Terminal
Start Symbol
![Page 7: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/7.jpg)
7
YACC Declaration Summary
`%start'
Specify the grammar's start symbol
`%union'
Declare the collection of data types that semantic values may have
`%token'
Declare a terminal symbol (token type name) with no precedence or associativity specified
`%type'
Declare the type of semantic values for a nonterminal symbol
![Page 8: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/8.jpg)
8
YACC Declaration Summary`%right'
Declare a terminal symbol (token type name) that is
right-associative
`%left'
Declare a terminal symbol (token type name) that is left-associative
`%nonassoc'
Declare a terminal symbol (token type name) that is nonassociative
(using it in a way that would be associative is a syntax error,
ex: x op. y op. z is syntax error)
![Page 9: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/9.jpg)
9
Grammar Rules Section
Normally written like this Example:
expr : expr '+' term
| term
;
term : term '*' factor
| factor
;
factor : '(' expr ')'
| ID
| NUM
;
![Page 10: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/10.jpg)
10
Work between LEX and YACC
Use enumeration / define YACC produce y.tab.h LEX include y.tab.h
yacc -d gram.y Will produce y.tab.h
![Page 11: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/11.jpg)
11
YACC and Bison Command
Yacc (AT&T) yacc –d xxx.y
Bison (GNU) bison –d –y xxx.y
Produce y.tab.c, the same as above yacc com
mand
![Page 12: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/12.jpg)
12
Work between LEX and YACC
%{#include <stdio.h>#include "y.tab.h"%}id [_a-zA-Z][_a-zA-Z0-9]*%%int { return INT; }char { return CHAR; }float { return FLOAT; }{id} { return ID;}
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token CHAR, FLOAT, ID, INT
%%
yacc -d xxx.y Produced
y.tab.h
# define CHAR 258
# define FLOAT 259
# define ID 260
# define INT 261
parser.y
scanner.l
![Page 13: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/13.jpg)
13
Debug YACC Parser
1. Use –t option or define YYDEBUG to 1.2. Set variable yydebug to 1 when you w
ant to trace parsing status.3. If you want to trace the semantic value
s Define your YYPRINT function
#define YYPRINT(file, type, value) yyprint(file, type, value)
static voidyyprint (FILE *file, int type, YYSTYPE value){ if (type == VAR) fprintf (file, " %s", value.tptr->name); else if (type == NUM) fprintf (file, " %d", value.val);}
![Page 14: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/14.jpg)
14
Simple Calculator Example - Files calc.l
Specifies the lex command specification file that defines the lexical analysis rules.
calc.y Specifies the yacc command grammar file that def
ines the parsing rules, and calls the yylex subroutine created by the lex command to provide input.
![Page 15: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/15.jpg)
15
Simple Calculator Example – YACC File %{ #include <stdio.h> int regs[26]; int base; %} %start list %token DIGIT LETTER %left '|' %left '&' %left '+' '-' %left '*' '/' '%' %left UMINUS /*supplies precedence for unary minus */
parser.y
![Page 16: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/16.jpg)
16
Simple Calculator Example – YACC File %% /* beginning of rules section */ list: /*empty */ | list stat '\n' | list error '\n' { yyerrok; } ; stat: expr { printf("%d\n",$1); } | LETTER '=' expr { regs[$1] = $3; } ;
expr: '(' expr ')' { $$ = $2; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | expr '%' expr { $$ = $1 % $3; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '&' expr { $$ = $1 & $3; } | expr '|' expr { $$ = $1 | $3; } |
![Page 17: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/17.jpg)
17
Simple Calculator Example – YACC File '-' expr %prec UMINUS { $$ = -$2; } | LETTER { $$ = regs[$1]; } | number ; number: DIGIT { $$ = $1; base = ($1==0) ? 8 : 10; } | number DIGIT { $$ = base * $1 + $2; } ;
![Page 18: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/18.jpg)
18
Simple Calculator Example – YACC File %% main() { return(yyparse()); } yyerror(s) char *s; { fprintf(stderr, "%s\n",s); } yywrap() { return(1); }
![Page 19: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/19.jpg)
19
Simple Calculator Example – Lex File %{ #include <stdio.h> #include "y.tab.h" int c; extern int yylval; %} %% " " ; [a-z] { c = yytext[0]; yylval = c - 'a'; return(LETTER); } [0-9] { c = yytext[0]; yylval = c - '0'; return(DIGIT); } [^a-z0-9\b] { c = yytext[0]; return(c); }
![Page 20: 1 YACC Parser Generator. 2 YACC YACC (Yet Another Compiler Compiler) Produce a parser for a given grammar. Compile a LALR(1) grammar Original written](https://reader036.vdocuments.us/reader036/viewer/2022072015/56649ec55503460f94bd06e0/html5/thumbnails/20.jpg)
20
Simple Calculator Example – Compile and Run bison -d –y calc.y
create y.tab.c and y.tab.h flex calc.l
create lex.yy.c gcc -g lex.yy.c y.tab.c -o calc
Create execution file ./calc
Run the calculator