Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 8th, 2012  |  syntax: None  |  size: 3.21 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. grammar tyap;
  2. options
  3. {
  4. language = CSharp3;
  5. }
  6.  
  7.  
  8. @header
  9. {
  10. using System;
  11. using tyapKurs;
  12. }
  13.  
  14. @members
  15. {
  16. private Emitter emitter;
  17.        
  18. public tyapParser(ITokenStream input, Emitter emitter) : this(input)
  19. {
  20.         this.emitter = emitter;
  21. }
  22. }
  23.  
  24. @lexer::members {
  25. public override void EmitErrorMessage( string msg )
  26. {
  27.         if (TraceDestination != null)
  28.                 TraceDestination.WriteLine( msg );
  29.         state.syntaxErrors++;
  30. }
  31. }
  32.  
  33. fragment LETTER
  34.         :       'A'..'Z' | 'a'..'z'
  35.         ;
  36.        
  37. fragment DIGIT
  38.         :       '0'..'9'
  39.         ;
  40.        
  41.  
  42. ID  :   LETTER DIGIT*
  43.     ;
  44.  
  45. INT :   DIGIT+
  46.     ;
  47.  
  48. COMMENT
  49.     :   '/*' .* '*/' {$channel=Hidden;}
  50.     ;
  51.  
  52. WS  :   ( ' '
  53.         | '\t'
  54.         | '\r'
  55.         | '\n'
  56.         ) {$channel=Hidden;}
  57.     ;
  58.  
  59. STRING
  60.     :  '\'' (LETTER | DIGIT | '\'\'')* '\''
  61.     ;
  62.    
  63. ADD     :       '+'
  64.         ;
  65.  
  66. SUB     :       '-'
  67.         ;
  68.        
  69. MUL     :       '*'
  70.         ;
  71.        
  72. DIV     :       '/'
  73.         ;
  74.        
  75. MOD     :       '%'
  76.         ;
  77.        
  78. LBRACK  :       '('
  79.         ;
  80.        
  81. RBRACK  :       ')'
  82.         ;
  83.        
  84. SEMI    :       ';'
  85.         ;
  86.        
  87. COMMA   :       ','
  88.         ;
  89.        
  90. ASSIG   :       ':='
  91.         ;
  92.        
  93. EQ      :       '=='
  94.         ;
  95.        
  96. NEQ     :       '!='
  97.         ;
  98.        
  99. LT      :       '<'
  100.         ;
  101.        
  102. GT      :       '>'
  103.         ;
  104.  
  105. LE      :       '<='
  106.         ;
  107.        
  108. GE      :       '>='
  109.         ;
  110.                  
  111. READ    :       ('R'|'r')('E'|'e')('A'|'a')('D'|'d')
  112.         ;
  113.        
  114. WRITE   :       ('W'|'w')('R'|'r')('I'|'i')('T'|'t')('E'|'e')
  115.         ;
  116.        
  117. FOR     :       ('F'|'f')('O'|'o')('R'|'r')
  118.         ;
  119.        
  120. TO      :       ('T'|'t')('O'|'o')
  121.         ;
  122.        
  123. BEGIN   :       ('B'|'b')('E'|'e')('G'|'g')('I'|'i')('N'|'n')
  124.         ;
  125.        
  126. END     :       ('E'|'e')('N'|'n')('D'|'d')
  127.         ;
  128.        
  129. IF      :       ('I'|'i')('F'|'f')
  130.         ;
  131.  
  132. ELSE    :       ('E'|'e')('L'|'l')('S'|'s')('E'|'e')
  133.         ;
  134.  
  135.  
  136. WHILE   :       ('W'|'w')('H'|'h')('I'|'i')('L'|'l')('E'|'e')
  137.         ;
  138.  
  139. public    
  140. program  
  141.         :       ( (variables SEMI)? {emitter.AddBegin();} operators {emitter.EndProgram();})
  142.         ;
  143.        
  144. variables
  145.         :       ( ID1 = ID {emitter.DeclareVar($ID1.text);} COMMA variables
  146.                 | ID2 = ID {emitter.DeclareVar($ID2.text);}
  147.                 |
  148.                 )
  149.         ;
  150.  
  151. operators
  152.         :       ( operator operators1
  153.                 |
  154.                 )              
  155.         ;
  156.  
  157. operators1
  158.         :       ( SEMI operators
  159.                 |
  160.                 )
  161.         ;
  162.  
  163. operator
  164.         :       ( READ ID1 = ID {emitter.AddRead($ID1.text); emitter.AddSemi();}
  165.                 | WRITE write  
  166.                 | ID2 = ID ASSIG expr {emitter.AddExpr($ID2.text); emitter.AddSemi();}
  167.                 | FOR {emitter.NewFor();}
  168.                         ID3 = ID ASSIG expr {emitter.AddExpr($ID3.text); emitter.AddSemi();}
  169.                         TO expr {emitter.AddForHeader($ID3.text);}
  170.                         BEGIN operators
  171.                         END {emitter.ForEnd();}
  172.                 | IF {emitter.NewIf();} expr {emitter.IfLeftExpr();} CMP1 = (EQ | NEQ | LT | GT | LE | GE) expr {emitter.IfRightExpr($CMP1.type);}
  173.                         BEGIN operators END {emitter.IfEndPos();}
  174.                         (ELSE BEGIN operators END)? {emitter.IfEndNeg();}
  175.                 | WHILE {emitter.NewWhile();} expr {emitter.WhileLeftExpr();} CMP2 = (EQ | NEQ | LT | GT | LE | GE) expr {emitter.WhileRightExpr($CMP2.type);}
  176.                         BEGIN operators END {emitter.WhileEnd();}
  177.                 )
  178.         ;
  179.  
  180. write   :       ( STRING {emitter.AddWrite($STRING.text); emitter.AddSemi();}
  181.                 | ID     {emitter.AddWrite($ID.text); emitter.AddSemi();}
  182.                 )
  183.         ;
  184.  
  185. expr    :       ( term expr1 )
  186.         ;
  187.        
  188. expr1   :       ( ADD1 = (ADD | SUB) term {emitter.NewExprSymb($ADD1.type, $ADD1.text);} expr1
  189.                 |
  190.                 )
  191.         ;
  192.  
  193. term    :       mult term1
  194.         ;
  195.        
  196. term1   :       ( MUL1 = (MUL | DIV | MOD) mult {emitter.NewExprSymb($MUL1.type, $MUL1.text);} term1
  197.                 |
  198.                 )
  199.         ;
  200.  
  201. mult    :       ( ID {emitter.NewExprSymb($ID.type, $ID.text);}
  202.                 | INT {emitter.NewExprSymb($INT.type, $INT.text);}
  203.                 | LBRACK expr RBRACK
  204.                 )
  205.         ;