- grammar tyap;
- options
- {
- language = CSharp3;
- }
- @header
- {
- using System;
- using tyapKurs;
- }
- @members
- {
- private Emitter emitter;
- public tyapParser(ITokenStream input, Emitter emitter) : this(input)
- {
- this.emitter = emitter;
- }
- }
- @lexer::members {
- public override void EmitErrorMessage( string msg )
- {
- if (TraceDestination != null)
- TraceDestination.WriteLine( msg );
- state.syntaxErrors++;
- }
- }
- fragment LETTER
- : 'A'..'Z' | 'a'..'z'
- ;
- fragment DIGIT
- : '0'..'9'
- ;
- ID : LETTER DIGIT*
- ;
- INT : DIGIT+
- ;
- COMMENT
- : '/*' .* '*/' {$channel=Hidden;}
- ;
- WS : ( ' '
- | '\t'
- | '\r'
- | '\n'
- ) {$channel=Hidden;}
- ;
- STRING
- : '\'' (LETTER | DIGIT | '\'\'')* '\''
- ;
- ADD : '+'
- ;
- SUB : '-'
- ;
- MUL : '*'
- ;
- DIV : '/'
- ;
- MOD : '%'
- ;
- LBRACK : '('
- ;
- RBRACK : ')'
- ;
- SEMI : ';'
- ;
- COMMA : ','
- ;
- ASSIG : ':='
- ;
- EQ : '=='
- ;
- NEQ : '!='
- ;
- LT : '<'
- ;
- GT : '>'
- ;
- LE : '<='
- ;
- GE : '>='
- ;
- READ : ('R'|'r')('E'|'e')('A'|'a')('D'|'d')
- ;
- WRITE : ('W'|'w')('R'|'r')('I'|'i')('T'|'t')('E'|'e')
- ;
- FOR : ('F'|'f')('O'|'o')('R'|'r')
- ;
- TO : ('T'|'t')('O'|'o')
- ;
- BEGIN : ('B'|'b')('E'|'e')('G'|'g')('I'|'i')('N'|'n')
- ;
- END : ('E'|'e')('N'|'n')('D'|'d')
- ;
- IF : ('I'|'i')('F'|'f')
- ;
- ELSE : ('E'|'e')('L'|'l')('S'|'s')('E'|'e')
- ;
- WHILE : ('W'|'w')('H'|'h')('I'|'i')('L'|'l')('E'|'e')
- ;
- public
- program
- : ( (variables SEMI)? {emitter.AddBegin();} operators {emitter.EndProgram();})
- ;
- variables
- : ( ID1 = ID {emitter.DeclareVar($ID1.text);} COMMA variables
- | ID2 = ID {emitter.DeclareVar($ID2.text);}
- |
- )
- ;
- operators
- : ( operator operators1
- |
- )
- ;
- operators1
- : ( SEMI operators
- |
- )
- ;
- operator
- : ( READ ID1 = ID {emitter.AddRead($ID1.text); emitter.AddSemi();}
- | WRITE write
- | ID2 = ID ASSIG expr {emitter.AddExpr($ID2.text); emitter.AddSemi();}
- | FOR {emitter.NewFor();}
- ID3 = ID ASSIG expr {emitter.AddExpr($ID3.text); emitter.AddSemi();}
- TO expr {emitter.AddForHeader($ID3.text);}
- BEGIN operators
- END {emitter.ForEnd();}
- | IF {emitter.NewIf();} expr {emitter.IfLeftExpr();} CMP1 = (EQ | NEQ | LT | GT | LE | GE) expr {emitter.IfRightExpr($CMP1.type);}
- BEGIN operators END {emitter.IfEndPos();}
- (ELSE BEGIN operators END)? {emitter.IfEndNeg();}
- | WHILE {emitter.NewWhile();} expr {emitter.WhileLeftExpr();} CMP2 = (EQ | NEQ | LT | GT | LE | GE) expr {emitter.WhileRightExpr($CMP2.type);}
- BEGIN operators END {emitter.WhileEnd();}
- )
- ;
- write : ( STRING {emitter.AddWrite($STRING.text); emitter.AddSemi();}
- | ID {emitter.AddWrite($ID.text); emitter.AddSemi();}
- )
- ;
- expr : ( term expr1 )
- ;
- expr1 : ( ADD1 = (ADD | SUB) term {emitter.NewExprSymb($ADD1.type, $ADD1.text);} expr1
- |
- )
- ;
- term : mult term1
- ;
- term1 : ( MUL1 = (MUL | DIV | MOD) mult {emitter.NewExprSymb($MUL1.type, $MUL1.text);} term1
- |
- )
- ;
- mult : ( ID {emitter.NewExprSymb($ID.type, $ID.text);}
- | INT {emitter.NewExprSymb($INT.type, $INT.text);}
- | LBRACK expr RBRACK
- )
- ;