Difference between revisions of "The YACC Parser Generator/Example: Calculator with Variables"

From Wiki**3

< The YACC Parser Generator
(The Lexical Analyzer (Flex) Specification)
Line 5: Line 5:
 
== The Lexical Analyzer (Flex) Specification ==
 
== The Lexical Analyzer (Flex) Specification ==
  
The lexical analyzer is very simple and limited to recognizing variable names, integers numbers, and the operators themselves.
+
The lexical analyzer (<tt>vars.l</tt>) is very simple and limited to recognizing variable names, integers numbers, and the operators themselves.
 
<text>
 
<text>
 
%option noyywrap
 
%option noyywrap

Revision as of 16:56, 18 April 2008

This example implements a simple calculator. The calculator has an unspecified number of integer variables and the common binary integer operators (namely, addition, subtraction, multiplication, division, and modulus), and unary integer operators (+ and -).

The language will contain the following concepts (tokens): VAR (a variable: the corresponding s attribute will contain its name); INT (an integer: the corresponding i attribute contains its value); and the operators (see below).

The Lexical Analyzer (Flex) Specification

The lexical analyzer (vars.l) is very simple and limited to recognizing variable names, integers numbers, and the operators themselves. <text> %option noyywrap %{

  1. include <cstdlib>
  2. include <string>
  3. include "y.tab.h"

%} %% [_[:alpha:]][_[:alnum:]]* yylval.s = new std::string(yytext); return VAR; digit:+ yylval.i = strtol(yytext, NULL, 10); return INT; [-+*/%=^:,] return *yytext; .|\n  ; /* ignore all the rest */ %% </text>

The Syntactic Analyzer (YACC) Specification

The syntactic analyzer will be built to immediately compute the expressions in a syntax-directed fashion as they occur. It is, thus, important to use trees that build nodes as the expressions occur (left-recursive grammars). If the grammar were right-recursive, the last node would be the first to be built and the (syntax-directed) evaluation would be from the last expression to the first.

The first task is to define the grammar itself (without worrying with semantics). <text> </text>