在《使用Antlr实现表达式引擎 》中写了主要的类,实现表达式的语法定义文件如下(使用的Antlr为3.0发布版本):
1
grammar XExpression;
2![](/Images/OutliningIndicators/None.gif)
3
options {
4
language=CSharp;
5
superClass=XExpressionBaseParser;
6
}
7![](/Images/OutliningIndicators/None.gif)
8
@header {
9
using XSoft.XExpression;
10
}
11![](/Images/OutliningIndicators/None.gif)
12
@members {
13
public XExpressionParser()
14
: base(null)
15
{
16
}
17
18
public override void Compile()
19
{
20
TokenStream = new CommonTokenStream(new XExpressionLexer(new ANTLRStringStream(Expression)));
21
ResultNode = xExpression();
22
}
23
}
24![](/Images/OutliningIndicators/None.gif)
25
xExpression returns[ExprNode value]
26
: a= logicalOrExpression {$value=a;};
27![](/Images/OutliningIndicators/None.gif)
28
logicalOrExpression returns[ExprNode value]
29
: a=logicalAndExpression {$value=a;}
30
(f=OR b=logicalAndExpression {GetNestedResultNode(ref $value, f, b);} )* ;
31
32
logicalAndExpression returns[ExprNode value]
33
: a=relationalExpression {$value=a;}
34
(f=AND b=relationalExpression {GetNestedResultNode(ref $value, f, b);} )* ;
35![](/Images/OutliningIndicators/None.gif)
36
relationalExpression returns[ExprNode value]
37
: a=additiveExpression {$value=a;}
38
((f=EQUAL | f=NOT_EQUAL | f=LESS_THAN | f=LESS_THAN_OR_EQUAL | f=GREATER_THAN | f=GREATER_THAN_OR_EQUAL) b=additiveExpression {GetNestedResultNode(ref $value, f, b);} )?
39
;
40
41
additiveExpression returns[ExprNode value]
42
: a=multiplyExpression {$value=a;}
43
((f=PLUS|f=MINUS) b=multiplyExpression {GetNestedResultNode(ref $value, f, b);} )*
44
;
45![](/Images/OutliningIndicators/None.gif)
46![](/Images/OutliningIndicators/None.gif)
47
multiplyExpression returns[ExprNode value]
48
: a=powExpr {$value=a;}
49
((f=STAR| f=DIV | f=MOD) b=powExpr {GetNestedResultNode(ref $value, f, b);} )* ;
50
51
powExpr returns[ExprNode value]
52
: a=unaryExpression {$value=a;}
53
(f=POWER b=unaryExpression {GetNestedResultNode(ref $value, f, b);} )? ;
54![](/Images/OutliningIndicators/None.gif)
55
unaryExpression returns[ExprNode value]
56
: (f=PLUS | f=MINUS | f=NOT) b=unaryExpression {GetNestedResultNodeArgsNotIncludeValue(ref $value, f, b);}
57
| a=primaryExpression {$value=a;}
58
;
59
60
primaryExpression returns[ExprNode value]
61
: (a=parenExpr|a=literal | a=function) {$value=a;};
62![](/Images/OutliningIndicators/None.gif)
63
parenExpr returns[ExprNode value]
64
: LPAREN a=xExpression RPAREN {$value=a;};
65
66
literal returns[ExprNode value]
67
: (a=numbericLiteral| a= stringLiteral | a=datetimeLiteral) {$value=a;};
68![](/Images/OutliningIndicators/None.gif)
69
function returns[ExprNode value]
70
@init { ArrayList list_arg = new ArrayList(); }
71
: f=IDENTIFIER LPAREN (arg=argument {list_arg.Add(arg);} (COMMA arg=argument { list_arg.Add(arg); } )*)? RPAREN
72
{ $value = GetNestedResultNode(f, list_arg); }
73
;
74![](/Images/OutliningIndicators/None.gif)
75
argument returns[ExprNode value]
76
: a=xExpression {$value=a;};
77![](/Images/OutliningIndicators/None.gif)
78
numbericLiteral returns[ExprNode value]
79
: a=INTEGER_LITERAL {$value = new ConstNode(new IntegerExprData(Convert.ToInt32(a.Text)));}
80
| a=DECIMAL_LITERAL {$value = new ConstNode(new DecimalExprData(Convert.ToDecimal(Convert.ToDouble(a.Text)))); }
81
;
82
83
datetimeLiteral returns[ExprNode value]
84
: a=DATETIME_LITERAL
85
{$value = new ConstNode(new DateTimeExprData(DateTime.Parse(a.Text.Substring(1, a.Text.Length - 2))));}
86
87
;
88
89
stringLiteral returns[ExprNode value]
90
: a=STRING_LITERAL
91
{$value = new ConstNode(new StringExprData(a.Text.Substring(1, a.Text.Length - 2)));}
92
;
93
94
AND: 'and';
95
OR: 'or';
96![](/Images/OutliningIndicators/None.gif)
97
NOT: 'not';
98![](/Images/OutliningIndicators/None.gif)
99
COMMA : ',' ;
100![](/Images/OutliningIndicators/None.gif)
101
PLUS: '+' ;
102
MINUS: '-' ;
103
DIV: '/' ;
104
STAR: '*' ;
105
MOD: '%' ;
106
POWER: '^' ;
107![](/Images/OutliningIndicators/None.gif)
108
EQUAL: '=';
109
NOT_EQUAL: '<>' ;
110
LESS_THAN: '<' ;
111
LESS_THAN_OR_EQUAL: '<=' ;
112
GREATER_THAN: '>' ;
113
GREATER_THAN_OR_EQUAL: '>=' ;
114![](/Images/OutliningIndicators/None.gif)
115
LPAREN: '(';
116
RPAREN: ')';
117![](/Images/OutliningIndicators/None.gif)
118
DATETIME_LITERAL: '\'' Digit Digit Digit Digit '-' Digit (Digit)? '-' Digit (Digit)? '\'';
119![](/Images/OutliningIndicators/None.gif)
120
STRING_LITERAL : '"'(~'"')* '"' ;
121![](/Images/OutliningIndicators/None.gif)
122
IDENTIFIER: LETTER (LETTER|Digit)* ;
123
124
fragment
125
LETTER : 'A'..'Z'|'a'..'z'|'_';
126![](/Images/OutliningIndicators/None.gif)
127
DECIMAL_LITERAL: (INTEGER_LITERAL)? '.' Digit* Exponent? ;
128
fragment
129
Exponent : ('e'|'E') INTEGER_LITERAL;
130![](/Images/OutliningIndicators/None.gif)
131
INTEGER_LITERAL : Digit+ ;
132![](/Images/OutliningIndicators/None.gif)
133
fragment
134
Digit :'0'..'9';
135![](/Images/OutliningIndicators/None.gif)
136
fragment
137
SIGN : '+' | '-';
138![](/Images/OutliningIndicators/None.gif)
139
WS : (' '|'\t')+ { $channel=HIDDEN; } ;
140![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)
55
![](/Images/OutliningIndicators/None.gif)
56
![](/Images/OutliningIndicators/None.gif)
57
![](/Images/OutliningIndicators/None.gif)
58
![](/Images/OutliningIndicators/None.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/None.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/None.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
74
![](/Images/OutliningIndicators/None.gif)
75
![](/Images/OutliningIndicators/None.gif)
76
![](/Images/OutliningIndicators/None.gif)
77
![](/Images/OutliningIndicators/None.gif)
78
![](/Images/OutliningIndicators/None.gif)
79
![](/Images/OutliningIndicators/None.gif)
80
![](/Images/OutliningIndicators/None.gif)
81
![](/Images/OutliningIndicators/None.gif)
82
![](/Images/OutliningIndicators/None.gif)
83
![](/Images/OutliningIndicators/None.gif)
84
![](/Images/OutliningIndicators/None.gif)
85
![](/Images/OutliningIndicators/None.gif)
86
![](/Images/OutliningIndicators/None.gif)
87
![](/Images/OutliningIndicators/None.gif)
88
![](/Images/OutliningIndicators/None.gif)
89
![](/Images/OutliningIndicators/None.gif)
90
![](/Images/OutliningIndicators/None.gif)
91
![](/Images/OutliningIndicators/None.gif)
92
![](/Images/OutliningIndicators/None.gif)
93
![](/Images/OutliningIndicators/None.gif)
94
![](/Images/OutliningIndicators/None.gif)
95
![](/Images/OutliningIndicators/None.gif)
96
![](/Images/OutliningIndicators/None.gif)
97
![](/Images/OutliningIndicators/None.gif)
98
![](/Images/OutliningIndicators/None.gif)
99
![](/Images/OutliningIndicators/None.gif)
100
![](/Images/OutliningIndicators/None.gif)
101
![](/Images/OutliningIndicators/None.gif)
102
![](/Images/OutliningIndicators/None.gif)
103
![](/Images/OutliningIndicators/None.gif)
104
![](/Images/OutliningIndicators/None.gif)
105
![](/Images/OutliningIndicators/None.gif)
106
![](/Images/OutliningIndicators/None.gif)
107
![](/Images/OutliningIndicators/None.gif)
108
![](/Images/OutliningIndicators/None.gif)
109
![](/Images/OutliningIndicators/None.gif)
110
![](/Images/OutliningIndicators/None.gif)
111
![](/Images/OutliningIndicators/None.gif)
112
![](/Images/OutliningIndicators/None.gif)
113
![](/Images/OutliningIndicators/None.gif)
114
![](/Images/OutliningIndicators/None.gif)
115
![](/Images/OutliningIndicators/None.gif)
116
![](/Images/OutliningIndicators/None.gif)
117
![](/Images/OutliningIndicators/None.gif)
118
![](/Images/OutliningIndicators/None.gif)
119
![](/Images/OutliningIndicators/None.gif)
120
![](/Images/OutliningIndicators/None.gif)
121
![](/Images/OutliningIndicators/None.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
125
![](/Images/OutliningIndicators/None.gif)
126
![](/Images/OutliningIndicators/None.gif)
127
![](/Images/OutliningIndicators/None.gif)
128
![](/Images/OutliningIndicators/None.gif)
129
![](/Images/OutliningIndicators/None.gif)
130
![](/Images/OutliningIndicators/None.gif)
131
![](/Images/OutliningIndicators/None.gif)
132
![](/Images/OutliningIndicators/None.gif)
133
![](/Images/OutliningIndicators/None.gif)
134
![](/Images/OutliningIndicators/None.gif)
135
![](/Images/OutliningIndicators/None.gif)
136
![](/Images/OutliningIndicators/None.gif)
137
![](/Images/OutliningIndicators/None.gif)
138
![](/Images/OutliningIndicators/None.gif)
139
![](/Images/OutliningIndicators/None.gif)
140
![](/Images/OutliningIndicators/None.gif)