Грамматика языка Pascal
%{
Dictionary<string,double> vars = new Dictionary<string,double>();
%}
%output=myyacc.cs
%union { public double dVal;
public string sVal; public int iVal; public ExprNode eVal; public List<ExprNode> elVal; public TreeNode tVal; public BlockNode lVal;
public GreatType dtVal;
public List<string> lsVal;}
%using System.IO
%using SimpleCompiler
%namespace LexScanner
%start progr
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT
%token PLUS MINUS MULT DIVIDE
%token AND OR NOT LT GT EQ NE LE GE DIV MOD
%token <iVal> INTNUM
%token <dVal> REALNUM
%token <sVal> STRINGLITERAL
%token <sVal> ID
%token <dtVal> kREAL kINTEGER
%type <iVal> funcid
%type <eVal> expr funccall
%type <tVal> stat elsepart
%type <lVal> liststat progr
%type <lsVal> listid
%type <elVal> exprlist
%type <dtVal> ktype kSimpleType
%left LT GT LE GE EQ NE
%left MINUS PLUS OR
%left MULT DIVIDE AND DIV MOD
%left UMINUS NOT
%%
progr : defss kBEGIN liststat kEND | error ;
defss : defs |defss defs | ;
defs : kVAR listid COLON ktype SEMICOLUMN ;
listid : ID |listid COLUMN ID ;
liststat : stat | liststat SEMICOLUMN stat
;
ktype : kSimpleType | error ;
kSimpleType : kREAL | kINTEGER ;
stat: { $$ = new Node(@$);} | ID ASSIGN expr | ID LQPAREN expr RQPAREN ASSIGN expr | kWHILE expr kDO stat | kIF expr kTHEN stat elsepart { $$ = new IfNode($2,$4,$5,@$); } | kBEGIN liststat kEND { $$ = $2;}
;
elsepart: {$$ = null;} | kELSE stat ;
exprlist : expr | exprlist COLUMN expr ;
expr: INTNUM
| REALNUM | ID | ID LQPAREN expr RQPAREN | expr PLUS expr | expr MINUS expr | expr MULT expr | expr DIVIDE expr | expr DIV expr | expr MOD expr | expr AND expr | expr OR expr | expr LT expr | expr GT expr | expr LE expr | expr GE expr | expr EQ expr | expr NE expr | NOT expr | MINUS expr %prec UMINUS | LPAREN expr RPAREN ;
%%