codingOL

Pseudo-Compact .g

Aug 6th, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.37 KB | None | 0 0
  1. grammar pseudoC;
  2.  
  3. options {  
  4.   output=AST;
  5.   backtrack=true;
  6. }  
  7.  
  8. tokens {
  9.     Program;
  10.     Declaration;
  11.     Codeblock;
  12.     Variables;
  13.     Statements;
  14.     Return;
  15.     Var;
  16.     FUNC_CALL;
  17.     UnaryMin;
  18.     Negation;
  19.     Lookup;
  20.     Indices;
  21.     Assignment;
  22.     VarDeclare;
  23.     If;
  24.     Exp;
  25.     Switch;
  26.     Case;
  27.     Default;
  28.     ExpList;
  29.     IdList;
  30.     List;
  31. }
  32.  
  33. @parser::header {
  34.   package us.cio.lily;
  35.  
  36.   import us.cio.lily.tree.*;
  37.  
  38.   import java.util.Map;
  39.   import java.util.HashMap;
  40. }  
  41.  
  42. @lexer::header {
  43.   package us.cio.lily;
  44. }  
  45.  
  46. @parser::members {
  47.    
  48.     public Map<String, Function> functions = new HashMap<String, Function>();
  49.    
  50.     private void defineFunction(String id, Object idList, Object block) {
  51.  
  52.     // `idList` is possibly null!  Create an empty tree in that case.  
  53.     CommonTree idListTree = idList == null ? new CommonTree() : (CommonTree)idList;
  54.  
  55.     // `block` is never null
  56.     CommonTree blockTree = (CommonTree)block;
  57.  
  58.     // The function name with the number of parameters after it, is the unique key
  59.     String key = id + idListTree.getChildCount();
  60.     functions.put(key, new Function(id, idListTree, blockTree));
  61.   }
  62.    
  63. }
  64.  
  65. parse  
  66.   : codeblock EOF -> codeblock
  67.   ;  
  68.  
  69. // Parser Rules
  70.  
  71. codeblock  
  72.     :   BEGIN (statement | functDecl)* (RETURN expression SCOLON)? END
  73.     ->  ^(Codeblock ^(Statements statement*) ^(Return expression?))
  74.     ;
  75.    
  76. statement
  77.     :   assignment SCOLON -> assignment
  78.     |   varDeclare SCOLON -> varDeclare
  79.     |   functionCall SCOLON -> functionCall
  80.     |   ifStatement
  81.     |   whileLoop
  82.     |   doWhileLoop
  83.     |   forLoop
  84.     |   switchStatement
  85.     ;
  86.    
  87. functionCall
  88.     :   ID O_PAREN exprList? C_PAREN    -> ^(FUNC_CALL ID exprList?)
  89.     |   SCANSTRING O_PAREN expression C_PAREN -> ^(FUNC_CALL SCANSTRING expression)
  90.     |   SCANNUMBER O_PAREN expression C_PAREN -> ^(FUNC_CALL SCANNUMBER expression)
  91.     |   PRINTING O_PAREN expression C_PAREN -> ^(FUNC_CALL PRINTING expression)
  92.     |   WRITE O_PAREN expression C_PAREN -> ^(FUNC_CALL WRITE expression)
  93.     ;
  94.    
  95. assignment
  96.     :   ID indices? EQUAL TO expression
  97.     ->  ^(Assignment ID indices? expression)
  98.     ;
  99.    
  100. varDeclare
  101.     :   DATATYPE ID indices? EQUAL TO expression
  102.     ->  ^(VarDeclare DATATYPE ID indices? expression)
  103.     ;
  104.  
  105. ifStatement
  106.     :   basicIfState elseIfState* elseState? SCOLON
  107.     ->  ^(If    basicIfState elseIfState* elseState?)
  108.     ;
  109.  
  110. basicIfState
  111.     :   WHEN O_PAREN expression C_PAREN DO codeblock
  112.     ->  ^(Exp   expression codeblock)
  113.     ;
  114.  
  115. elseIfState
  116.     :   OR ELSE IF O_PAREN expression C_PAREN DO codeblock
  117.     ->  ^(Exp   expression codeblock)
  118.     ;
  119.  
  120. elseState
  121.     :   ELSE DO codeblock
  122.     ->  ^(Exp   codeblock)
  123.     ;
  124.    
  125. whileLoop
  126.     :   AS LONG AS O_PAREN expression C_PAREN DO codeblock SCOLON
  127.     ->  ^(AS LONG AS    expression codeblock)
  128.     ;
  129.  
  130. doWhileLoop
  131.     :   PERFORM codeblock AS LONG AS O_PAREN expression C_PAREN SCOLON
  132.     ->  ^(PERFORM   codeblock expression)
  133.     ;
  134.  
  135. forLoop
  136.     :   WHERE ID '=' expression UNTIL expression DO codeblock SCOLON
  137.     ->  ^(WHERE ID expression expression codeblock)
  138.     ;
  139.    
  140. switchStatement
  141.     :   USING O_PAREN expression C_PAREN AND WITH O_CURLY caseEnum+ defaultState? C_CURLY SCOLON
  142.     ->  ^(Switch    expression caseEnum+ defaultState?)
  143.     ;
  144.  
  145. caseEnum
  146.     :   CASE expression DO codeblock ('break' SCOLON | 'continue' SCOLON)?
  147.     ->  ^(Case expression codeblock)
  148.     ;
  149.  
  150. defaultState
  151.     :   WHEN DEFAULTKEY DO codeblock 'break' SCOLON
  152.     ->  ^(Default codeblock)
  153.     ;
  154.  
  155. functDecl
  156.     :   DEFINE ID O_PAREN idList? C_PAREN codeblock
  157.         {defineFunction($ID.text,$idList.tree,$codeblock.tree);}
  158.     ;
  159.    
  160. idList
  161.     :   ID (COMMA ID)*
  162.     ->  ^(IdList    ID+)
  163.     ;
  164.  
  165. exprList
  166.     :   expression (COMMA expression)*
  167.     ->  ^(ExpList   expression+)
  168.     ;
  169.    
  170. expression
  171.     :   orExpr
  172.     ;
  173.  
  174. orExpr 
  175.     :   andExpr (OR^ andExpr)*
  176.     ;
  177.  
  178. andExpr  
  179.     :   equalExpr (AND^ equalExpr)*
  180.     ;
  181.    
  182. equalExpr
  183.     :   relationExpr (('==' | '!=')^ relationExpr)*
  184.     ;
  185.    
  186. relationExpr
  187.     :   addExpr (('>' | '<' | '>=' | '<=')^ addExpr)*
  188.     ;
  189.  
  190. addExpr
  191.     :   mulExpr ((ADD | SUB)^ mulExpr)*
  192.     ;
  193.  
  194. mulExpr
  195.     :   unaryExpr ((MULT | DIV | MOD)^ unaryExpr)*
  196.     ;
  197.  
  198. unaryExpr
  199.     :   SUB atom    -> UnaryMin atom
  200.     |   NOT ARROW atom  -> Negation atom
  201.     |   atom
  202.     ;
  203.  
  204. atom   
  205.     :   INT
  206.     |   FLOAT
  207.     |   BOOL
  208.     |   lookup
  209.     ;
  210.  
  211. lookup
  212.     :   functionCall indices?   -> ^(Lookup functionCall indices?)
  213.     |   list indices? -> ^(Lookup list indices?)
  214.     |   O_PAREN expression C_PAREN indices? -> ^(Lookup expression indices?)
  215.     |   ID indices? -> ^(Lookup ID indices?)
  216.     |   STRING indices? -> ^(Lookup STRING indices?)
  217.     ;
  218.  
  219. list    :   '[' exprList? ']' -> ^(List exprList?) ;
  220.    
  221. indices :   ('[' expression ']')+  -> ^(Indices expression+)
  222.     ;
  223.  
  224.    
  225. // Lexer Rules
  226.  
  227. BEGIN   :   'begin';
  228. END :   'end';
  229. USING   :   'using';
  230. DEFINE  :   'define';
  231. WHEN    :   'when' ;
  232. WHERE   :   'where';
  233. UNTIL   :   'until';
  234. CASE    :   'case';
  235. DO  :   'do' ;
  236. AS  :   'as' ;
  237. LONG    :   'long';
  238. OR  :   'or' ;
  239. RETURN  :   'return' ;
  240. AND     :   'and' ;
  241. WITH    :   'with' ;
  242. EQUAL   :   'equal' ;
  243. IS  :   'is';
  244. IF  :   'if';
  245. NOT :   'not';
  246. TO  :   'to';
  247. LESS    :   'less';
  248. GREATER :   'greater';
  249. THAN    :   'than';
  250. WRITE   :   'write';
  251. PRINTING
  252.     :   'printing' ;
  253. PERFORM :   'perform' ;
  254. ELSE    :   'else' ;
  255. DEFAULTKEY  :   'default' ;
  256. BREAK   :   'break' ;
  257. CONTINUE:   'continue' ;
  258. SCANSTRING 
  259.     :   'scanString' ;
  260. SCANNUMBER
  261.     :   'scanNumber' ;
  262. DATATYPE   
  263.     :   'num'
  264.     |   'char'
  265.     |   'String'
  266.     ;
  267. O_PAREN :   '(';
  268. C_PAREN :   ')';
  269. O_CURLY :   '{';
  270. C_CURLY :   '}';
  271. O_ANGLE :   '<';
  272. C_ANGLE :   '>';
  273. COMMA   :   ',';
  274. SCOLON  :   ';';
  275. FULLSTOP:   '.';
  276. ASSIGN  :   ':=';
  277. ARROW   :   '->';
  278. SUB :   '-';
  279. ADD :   '+';
  280. MULT    :   '*';
  281. DIV :   '/';
  282. MOD :   'mod';
  283. BOOL    :   'true' | 'false' ;
  284.  
  285. ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
  286.     ;
  287.  
  288. INT :   '0'..'9'+
  289.     ;
  290.  
  291. FLOAT
  292.     :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
  293.     |   '.' ('0'..'9')+ EXPONENT?
  294.     |   ('0'..'9')+ EXPONENT
  295.     ;
  296.  
  297. WS  :   ( ' '
  298.         | '\t'
  299.         | '\r'
  300.         | '\n'
  301.         ) {skip();}  
  302.     ;
  303.  
  304. STRING
  305. @after {
  306.   setText(getText().substring(1, getText().length()-1).replaceAll("\\\\(.)", "$1"));
  307. }  
  308.     :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
  309.     |  '\'' (~('\'' | '\\') | '\\' ('\\' | '\''))* '\''  
  310.     ;
  311.  
  312. CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
  313.     ;
  314.  
  315. fragment
  316. EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
  317.  
  318. fragment
  319. HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
  320.  
  321. fragment
  322. ESC_SEQ
  323.     :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
  324.     |   UNICODE_ESC
  325.     |   OCTAL_ESC
  326.     ;
  327.  
  328. fragment
  329. OCTAL_ESC
  330.     :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
  331.     |   '\\' ('0'..'7') ('0'..'7')
  332.     |   '\\' ('0'..'7')
  333.     ;
  334.  
  335. fragment
  336. UNICODE_ESC
  337.     :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
  338.     ;
Advertisement
Add Comment
Please, Sign In to add comment