Грамматика языка Pascal
Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
%{ 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 ; %%