表达式语法文件 for Antlr

使用AntlrWorks编写了以下Expr.g语法文件,考虑到便与后期遍历树构造节点方便,添加了一些虚Token,例如BINARY。
 语法文件内容如下:

  1  grammar Expr;
  2 
  3  options {
  4    output = AST;
  5    ASTLabelType = CommonTree;
  6    //  language=CSharp;
  7  }
  8 
  9  tokens {
 10        CALL;
 11      INDEX;
 12      BINARY;
 13      UNARY;
 14      CONST;
 15      VAR;
 16      FIELD;
 17  }
 18 
 19  expr 
 20      :    logicalOrExpr
 21      ;
 22 
 23  logicalOrExpr 
 24      :    (logicalAndExpr -> logicalAndExpr) (OR b = logicalAndExpr  ->   ^ (BINARY OR $logicalOrExpr $b)) *
 25      ;
 26                          
 27  logicalAndExpr 
 28      :    (equalityExpr -> equalityExpr) (AND b = equalityExpr  ->   ^ (BINARY AND $logicalAndExpr $b)) *   
 29      ;   
 30                           
 31  equalityExpr 
 32      :    (relationalExpr -> relationalExpr) ((a = EQUALS | a = NOTEQUALS) b = relationalExpr  ->   ^ (BINARY $a $equalityExpr $b)) *
 33      ;
 34      
 35  relationalExpr 
 36      :    (additiveExpr  ->  additiveExpr) ((a = LT | a = LTEQ | a = GT | a = GTEQ) b = additiveExpr  ->   ^ (BINARY $a $relationalExpr $b)) ?  
 37      ;
 38    
 39  additiveExpr 
 40      :    (multiplyExpr ->  multiplyExpr) ((a = PLUS | a = MINUS) b = multiplyExpr  ->   ^ (BINARY $a $additiveExpr $b)) *
 41        ;
 42 
 43  multiplyExpr 
 44        :    (powExpr -> powExpr) ((a = MUL | a = DIV | a = MOD) b = powExpr  ->^ (BINARY $a $multiplyExpr $b)) *  
 45         ;
 46     
 47  powExpr 
 48         :    (unaryExpr  -> unaryExpr) (POWER b = unaryExpr  ->   ^ (BINARY POWER $powExpr $b)) ?  
 49         ;   
 50 
 51  unaryExpr 
 52      :      (a = PLUS  |  a = MINUS  |  a = NOT) unaryExpr  ->   ^ (UNARY $a unaryExpr)      
 53       |       memberExpr 
 54      ;
 55         
 56  memberExpr 
 57         :    basicExpr ^  (memberAccessExpr | indexerExpr) *  
 58         ;
 59 
 60  basicExpr 
 61      :    constant  |   varExpr  |  methodExpr  |  parenExpr;       
 62         
 63  parenExpr 
 64         :    LPAREN expr  RPAREN  ->  expr
 65         ; 
 66         
 67  constant  
 68        :      (a = INTEGER_LITERAL  |  a = DECIMAL_LITERAL  |  a = DATETIME_LITERAL  |  a = STRING_LITERAL  |  a = BOOL_LITERAL)  ->   ^ (CONST $a)
 69         ;    
 70         
 71  memberAccessExpr 
 72      :     ' . ' !  memberFunctionExpr
 73      ;
 74 
 75  memberFunctionExpr 
 76      :    fieldPropertyExpr  ->   ^ (FIELD fieldPropertyExpr)  |  methodExpr
 77      ;
 78      
 79  fieldPropertyExpr 
 80      :    IDENTIFIER
 81      ;    
 82      
 83  varExpr    
 84      :    IDENTIFIER  ->   ^ (VAR IDENTIFIER)
 85      ;
 86  methodExpr    
 87      :    IDENTIFIER LPAREN (argument (COMMA argument) * ) ?  RPAREN  ->   ^ (CALL IDENTIFIER argument * )
 88      ;
 89          
 90  indexerExpr 
 91      :    LBRACKET argument (COMMA argument) *  RBRACKET  ->   ^ (INDEX argument + )
 92      ;
 93      
 94  argument 
 95        :     expr 
 96        ;   
 97 
 98     
 99  AND    
100      :     ' and '
101      ;
102      
103  OR    
104      :      ' or '
105      ;
106 
107  NOT    
108      :      ' not '
109      ;
110 
111  COMMA     
112      :      ' , '   
113      ;
114 
115  PLUS    
116      :      ' + '   
117      ;
118      
119  MINUS    
120      :      ' - '
121      ;
122      
123  MUL    
124      :      ' * '   
125      ;
126      
127  DIV    
128      :      ' / '   
129      ;
130      
131  MOD    
132      :      ' % '
133      ;
134      
135  POWER    
136      :      ' ^ '
137      ;
138      
139  EQUALS    :     ' = ' ;
140      
141  NOTEQUALS 
142      :     ' != '   |   ' <> ' ;
143      
144  LT    :     ' < ' ;
145  LTEQ    :     ' <= ' ;
146  GT    :     ' > ' ;
147  GTEQ    :     ' >= ' ;
148 
149  LPAREN
150      :     ' ( '
151      ;
152      
153  RPAREN    :     ' ) '
154      ;
155 
156  LBRACKET
157      :     ' [ '
158      ;
159 
160  RBRACKET
161      :     ' ] '
162      ;
163      
164  DATETIME_LITERAL
165      :      ' \ ''  STRING_LITERAL  ' \ ''
166      ;
167 
168  STRING_LITERAL    
169      :     ' " '  ( ~ ' " ' ) *   ' " '     
170      ;
171 
172  BOOL_LITERAL
173      :     ' true ' | ' True ' | ' false ' | ' False '
174      ;
175 
176  IDENTIFIER
177      :    LETTER (LETTER | Digit) *
178      ;
179      
180  fragment
181  LETTER    
182      :     ' A ' .. ' Z ' | ' a ' .. ' z ' | ' _ '
183      ;
184 
185  DECIMAL_LITERAL
186      :       (INTEGER_LITERAL) ?   ' . '  Digit *  Exponent ?  
187      ;
188 
189  fragment
190  Exponent 
191      :     ( ' e ' | ' E ' ) INTEGER_LITERAL
192      ;
193 
194  INTEGER_LITERAL 
195      :     Digit +  
196      ;    
197 
198  fragment
199  Digit    
200      :     ' 0 ' .. ' 9 '
201      ;
202 
203          
204 
205  /*  Ignore white spaces  */     
206  WS    
207      :  ( '   ' | ' \r ' | ' \t ' | ' \u000C ' | ' \n ' ) {$channel = HIDDEN;}
208      ;
209 

在AntlrWorks调试以下语句:2-3+IIF(true=false, ds.b[1].id+bb, pp())
解析后的AST为:
AST.jpg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值