打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Antlr实现表达式引擎

上周末尝试使用Antlr生成C#语言的表达式引擎,目前已经可以支持基本运算.主要思路是把表达式解析成操作数和函数(操作符也作为函数看待)两种类型节点,主要部分类图如下:

GrandExpr.g文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
grammar GrandExpr;
  
options {
  output=AST;
  ASTLabelType=CommonTree;
 // language=CSharp;
}
  
tokens
{
    INDEX;
    MEMBERACCESS;
    CALL;
}
  
expr
    :   logicalOrExpr
    ;
  
logicalOrExpr 
    :   logicalAndExpr (OR logicalAndExpr)* 
    ;
                          
logicalAndExpr
    :   equalityExpr (AND equalityExpr)*  
    ;   
                           
equalityExpr
    :   relationalExpr ((EQUALS|NOTEQUALS)^ relationalExpr)*
    ;
      
relationalExpr
    :   additiveExpr ((LT|LTEQ|GT|GTEQ)^ additiveExpr)? 
    ;
    
additiveExpr
    :   multiplyExpr ((PLUS|MINUS)^ multiplyExpr)*
    ;
  
multiplyExpr
    :   powExpr ((a=MUL| a=DIV | a=MOD) powExpr)* 
    ;
     
powExpr
    :   unaryExpr (POWER unaryExpr)? 
    ;   
  
unaryExpr
    :   (PLUS | MINUS | NOT) unaryExpr    
    |   memberExpr 
    ;
         
memberExpr
    :   basicExpr (memberAccessExpr)*  (indexerExpr)?
    ;
  
basicExpr
    :    parenExpr | literal |  memberFunctionExpr;     
         
parenExpr 
    :   LPAREN! expr  RPAREN!
    
      
literal 
    :   numbericLiteral
    |   stringLiteral 
    ;   
      
numbericLiteral
    :   INTEGER_LITERAL 
    |   DECIMAL_LITERAL 
    |   DATETIME_LITERAL
    ;
     
stringLiteral
    :   STRING_LITERAL   
    ;
      
      
memberAccessExpr
    :   '.' memberFunctionExpr -> ^(MEMBERACCESS memberFunctionExpr)
    ;
  
memberFunctionExpr
    :   fieldPropertyExpr | methodExpr
    ;
      
fieldPropertyExpr
    :   IDENTIFIER
    ;   
     
methodExpr  
    :   IDENTIFIER LPAREN (argument (COMMA argument)*)? RPAREN -> ^(CALL IDENTIFIER argument*)
    ;
          
  
indexerExpr 
    :   LBRACKET argument (COMMA argument)* RBRACKET -> ^(INDEX argument+)
    ;
      
argument 
    :   expr 
    ;   
  
     
AND 
    :   'and'
    ;
      
OR  
    :   'or'
    ;
  
NOT 
    :   'not'
    ;
  
COMMA   
    :   ','  
    ;
  
PLUS    
    :   '+'  
    ;
      
MINUS   
    :   '-'
    ;
      
MUL 
    :   '*'  
    ;
      
DIV 
    :   '/'  
    ;
      
MOD 
    :   '%'
    ;
      
POWER   
    :   '^'
    ;
      
EQUALS  :   '=';
      
NOTEQUALS 
    :   '!=' | '<>';
      
LT  :   '<';
LTEQ    :   '<=';
GT  :   '>';
GTEQ    :   '>=';
  
LPAREN
    :   '('
    ;
      
RPAREN  :   ')'
    ;
  
LBRACKET
    :   '['
    ;
  
RBRACKET
    :   ']'
    ;
      
DATETIME_LITERAL
    :   '\'' STRING_LITERAL '\''
    ;
  
STRING_LITERAL  
    :   '"' (~'"')* '"' 
    ;
  
IDENTIFIER
    :   LETTER (LETTER|Digit)*
    ;
      
fragment
LETTER  
    :   'A'..'Z'|'a'..'z'|'_'
    ;
  
DECIMAL_LITERAL
    :       (INTEGER_LITERAL)? '.' Digit* Exponent? 
    ;
  
fragment
Exponent 
    :   ('e'|'E') INTEGER_LITERAL
    ;
  
INTEGER_LITERAL 
    :   Digit+ 
    ;   
  
fragment
Digit   
    :   '0'..'9'
    ;
  
/* Ignore white spaces */   
WS  
    :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
    ;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
解释器模式第二篇 形成语法树
Migrating from ANTLR 2 to ANTLR 3 - ANTLR 3 wiki
ANTLR 学习
linux中ftp命令参数详解
英文词根(四)
linux ftp详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服