Грамматика языка 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
;
%%