123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- ============================================================
- Introduction to Bison.
- ============================================================
- 1. Get started!
- a) Check the available files:
- - Makefile : makefile to build the parser.
- - scanner.flex : the lexical analyser (scanner) in flex
- - parser.bison: the parser in bison
- Note: the given scanner & grammar only deal
- with numbers and the "+" operator.
- - common.c, common.h : common definitions / routines
- - ex1.txt ex2.txt ex3.txt : samples
- b) Compile the parser by typing "make" in the command line.
- The generated executable file is called "parser".
- c) Execute the parser for exemplo1.txt exemplo2.txt exemplo3.txt
- e.g. "./parser exemplo1.txt".
- You should get errors for all of them.
- Modify these files until the parser reports no errors.
- ============================================================
- 2. You may have noticed during compilation (step 1b)
- that bison reports "1 shift/reduce conflict"
- (if you missed it, recompile the parser using "make clean all").
- The conflict comes from the ambiguity of "expr ADD_TOKEN expr"
- (why is it ambiguous?).
- To overcome this conflict add
- %left ADD_TOKEN
- to the parser specification (on top) and re-compile.
- This change specifies left associativity for sum expressions
- and gets rid of the ambiguity.
- ============================================================
- 3. Complete the grammar to also handle the binary operators
- -, *, and /.
- Use %left as in step 2 to ensure there are no grammar conflicts.
- ============================================================
- 4. Now we will use semantic actions to associate a "double"
- value to each expression, and print these values.
- Proceed in the following steps:
- a) In parser.bison add at the top
- %define api.value.type { double }
- This will set "double" as the type of expressions.
- b) Modify scanner.flex to assign the value of a number to
- the special variable 'yylval' as part of the actions in the
- NUMBER_TOKEN rule. You may use the C library function 'atof'
- to convert the 'yytext' string to a number.
- c) In parser.bison encode semantic actions as follows:
- NUMBER_TOKEN { $$ = $1; }
- expr SUM_TOKEN expr { $$ = $1 + $3;}
- ... etc ...
- d) Use a semantic action for 'prog' to print the value of each
- expression read from the input
-
- e) If the values printed are wrong look at the order of the
- "%left" directives for the operators.
- This order dictates the precedence (lowest to highest) for
- the operators.
- 5. Extensions (outside class):
- a) Allow single-line comments begginning with "#".
- b) Handle expressions between "(" and ")".
- c) Allow variables identified by "a" to "z" in expressions, and allow
- attributions of the form "var = expr".
- You may assume all variables are initially 0.
- Suggestion: use an array to hold variable values.
- ============================================================
|