www.pudn.com > LexYaccProgs.zip > EXPR.Y


 
/* Sample Yacc grammar for a simple desktop calculator; derived from a 
   grammar in Aho et al: Compilers. Principles, Techniques and Tools (Sect. 
   4.9). 
 
   Lexical analyzer is in Lex program ExprLex.l. 
 
   To compile parser and lexical analyzer, issue the following commands: 
 
     yacc expr 
     lex  exprlex 
     tpc  expr 
 
   Description: This program reads simple arithmetic expressions, constructed 
   with real constants, operators +, -, *, /, unary - and parentheses 
   (operators have their usual precedence, unary minus is highest), from 
   standard input (one per line) and prints the result on standard output. 
   Variables are denoted by a single letter (no distinction between upper and 
   lowercase letters); they are assigned values through an assignment of the 
   form =. 
   The program is terminated by entering an empty line. */ 
 
%{ 
 
uses YaccLib, LexLib; 
 
var x : array [1..26] of Real; 
 
%} 
 
%token  NUM       /* constants */ 
%token  ID     /* variables */ 
%type  expr	/* expressions */ 
 
%left '+' '-'      	/* operators */ 
%left '*' '/' 
%right UMINUS 
 
%token ILLEGAL 		/* illegal token */ 
 
%% 
 
input	: /* empty */ 
	| input '\n'		 { yyaccept; } 
	| input expr '\n'	 { writeln($2:10:2); } 
	| input ID '=' expr '\n' { x[$2] := $4; writeln($4:10:2); } 
	| error '\n'             { yyerrok; } 
	; 
 
expr    :  expr '+' expr	 { $$ := $1 + $3; } 
	|  expr '-' expr	 { $$ := $1 - $3; } 
	|  expr '*' expr	 { $$ := $1 * $3; } 
	|  expr '/' expr	 { $$ := $1 / $3; } 
	|  '(' expr ')'		 { $$ := $2; } 
	|  '-' expr              { $$ := -$2; } 
           %prec UMINUS 
	|  NUM                   { $$ := $1; } 
        |  ID                    { $$ := x[$1]; } 
	; 
 
%% 
 
{$I ExprLex} 
 
var i : Integer; 
 
begin 
  for i := 1 to 26 do x[i] := 0.0; 
  if yyparse=0 then { done }; 
end.