-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGovaluate.g4
129 lines (111 loc) · 3.38 KB
/
Govaluate.g4
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
grammar Govaluate;
prog
: blockStatements
;
block
: '{' blockStatements '}'
;
blockStatements
: statement*
;
statement : blockLabel=block
| statementExpression=expression ';'
| FOR '(' forControl ')' statement
| FOREACH '(' foreachControl ')' statement
| IF parExpression statement (ELSE statement)?
;
expression: primary
| expression bop='.' ( IDENTIFIER | functionCall)
| expression bop='[' expression ']'
| '(' expression ')'
| functionCall
| expression postfix=('++' | '--')
| prefix=('+'|'-'|'++'|'--') expression
| prefix=('~'|'!') expression
| expression bop=('**'|'^') expression
| expression bop=('*'|'/'|'%') expression
| expression bop=('+'|'-') expression
| expression bop=('<<' | '>>') expression
| expression bop=('<=' | '>=' | '>' | '<') expression
| expression bop=('==' | '!=') expression
| expression bop='&' expression
| expression bop='|' expression
| expression bop='&&' expression
| expression bop='||' expression
| expression bop='?' expression ':' expression
| <assoc=right> expression
bop=('=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' | '>>=' | '>>>=' | '<<=' | '%=')
expression
| expression bop='in' expression
;
forControl
: forInit? ';' expression? ';' forUpdate=expressionList?
;
forInit: expressionList
;
foreachControl : fromExpression=expression 'as' keyExpression=expression '=>' valueExpression=expression;
parExpression
: '(' expression ')'
;
expressionList
: expression (',' expression)*
;
functionCall
: IDENTIFIER '(' expressionList? ')'
;
primary: FLOAT_LITERAL #float
| STRING_LITERAL #string
| BOOL_LITERAL #bool
| array #arrays
| IDENTIFIER #identifier
;
FOR: 'for';
FOREACH: 'foreach';
IF : 'if';
ELSE : 'else' ;
// float 定义
FLOAT_LITERAL: [0-9]+
| (Digits '.' Digits? | '.' Digits) ExponentPart? [fFdD]?
| Digits (ExponentPart [fFdD]? | [fFdD])
;
fragment ExponentPart
: [eE] [+-]? Digits
;
fragment Digits
: [0-9] ([0-9_]* [0-9])?
;
// string 定义
STRING_LITERAL: '\'' (~['\\\r\n] | EscapeSequence)* '\'';
fragment EscapeSequence
: '\\' [btnfr"'\\]
| '\\' ([0-3]? [0-7])? [0-7]
| '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
;
fragment HexDigits
: HexDigit ((HexDigit | '_')* HexDigit)?
;
fragment HexDigit
: [0-9a-fA-F]
;
BOOL_LITERAL: 'true'
| 'false'
;
array : '(' array_value (',' array_value)* ')' ;
array_value : STRING_LITERAL
| FLOAT_LITERAL
| BOOL_LITERAL
;
// Identifiers
IDENTIFIER: Letter LetterOrDigit*
| '${' Letter (LetterOrDigit|[-])+ '}'
;
fragment LetterOrDigit
: Letter
| [0-9_]
;
fragment Letter
: [a-zA-Z$] // these are the "java letters" below 0x7F
| ~[\u0000-\u007F\uD800-\uDBFF] // covers all characters above 0x7F which are not a surrogate
| [\uD800-\uDBFF] [\uDC00-\uDFFF] // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
;
WS: [ \t\r\n]+ -> skip; // 忽略空白字符