-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathrustemo.rustemo
More file actions
115 lines (102 loc) · 3.38 KB
/
rustemo.rustemo
File metadata and controls
115 lines (102 loc) · 3.38 KB
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
File: GrammarRule+
| ImportStm+ GrammarRule+
| GrammarRule+ 'terminals' TerminalRule+
| ImportStm+ GrammarRule+ 'terminals' TerminalRule+
| 'terminals' TerminalRule+;
ImportStm: 'import' path=StrConst
| 'import' path=StrConst 'as' Name;
GrammarRule: Annotation? Name ':' rhs=GrammarRuleRHS ';'
| Annotation? Name '{' meta=ProdMetaDatas '}' ':' rhs=GrammarRuleRHS ';';
GrammarRuleRHS: rhs=GrammarRuleRHS '|' Production
| Production;
Production: Assignment+
| Assignment+ '{' meta=ProdMetaDatas '}';
TerminalRule: Annotation? Name ':' Recognizer ';'
| Annotation? Name ':' ';'
| Annotation? Name ':' Recognizer '{' meta=TermMetaDatas '}' ';'
| Annotation? Name ':' '{' meta=TermMetaDatas '}' ';';
ProdMetaData: 'left' {Left} | 'reduce' {Reduce} | 'right' {Right} | 'shift' {Shift}
| 'dynamic' {Dynamic} | 'nops' {NOPS} | 'nopse' {NOPSE}
| IntConst {Priority}
| UserMetaData
| ProdKind;
ProdMetaDatas: metas=ProdMetaDatas ',' meta=ProdMetaData | meta=ProdMetaData;
TermMetaData: 'prefer' {Prefer} | 'finish' {Finish} | 'nofinish' {NoFinish}
| 'left' {Left} | 'reduce' {Reduce} | 'right' {Right} | 'shift' {Shift}
| 'dynamic' {Dynamic}
| IntConst {Priority}
| UserMetaData;
TermMetaDatas: metas=TermMetaDatas ',' meta=TermMetaData | meta=TermMetaData;
UserMetaData: Name ':' value=ConstVal;
ProdKind: Name;
ConstVal: IntConst | FloatConst | BoolConst | StrConst;
Assignment: PlainAssignment
| BoolAssignment
| GrammarSymbolRef;
PlainAssignment: Name '=' gsymref=GrammarSymbolRef;
BoolAssignment: Name '?=' gsymref=GrammarSymbolRef;
ProductionGroup: '(' prod_rule_rhs=GrammarRuleRHS ')';
GrammarSymbolRef: gsymbol=GrammarSymbol RepetitionOperator?
| ProductionGroup RepetitionOperator?;
RepetitionOperator: RepetitionOperatorOp RepetitionModifiers?;
RepetitionOperatorOp: '*' {ZeroOrMore}
| '*!' {ZeroOrMoreGreedy}
| '+' {OneOrMore}
| '+!' {OneOrMoreGreedy}
| '?' {Optional}
| '?!' {OptionalGreedy};
RepetitionModifiers: '[' RepetitionModifier+[Comma] ']';
RepetitionModifier: Name;
GrammarSymbol: Name | StrConst;
Recognizer: StrConst | RegexTerm;
// ANCHOR: layout
Layout: LayoutItem*;
LayoutItem: WS | Comment;
Comment: '/*' Corncs '*/' | CommentLine;
Corncs: Cornc*;
Cornc: Comment | NotComment | WS;
// ANCHOR_END: layout
terminals
Terminals: 'terminals';
Import: 'import';
As: 'as';
Colon: ':';
SemiColon: ';';
Comma: ',';
OBrace: '{';
CBrace: '}';
OBracket: '(';
CBracket: ')';
OSBracket: '[';
CSBracket: ']';
Choice: '|';
ZeroOrMore: '*';
ZeroOrMoreGreedy: '*!';
OneOrMore: '+';
OneOrMoreGreedy: '+!';
Optional: '?';
OptionalGreedy: '?!';
Equals: '=';
QEquals: '?=';
Left: 'left';
Right: 'right';
Reduce: 'reduce';
Shift: 'shift';
Dynamic: 'dynamic';
NOPS: 'nops';
NOPSE: 'nopse';
Prefer: 'prefer';
Finish: 'finish';
NoFinish: 'nofinish';
OComment: '/*';
CComment: '*/';
Name: /[a-zA-Z_][a-zA-Z0-9_\.]*/;
RegexTerm: /\/(\\.|[^\/\\])*\//;
IntConst: /\d+/;
FloatConst: /[+-]?[0-9]+[.][0-9]*([e][+-]?[0-9]+)?/;
BoolConst: /true|false/;
StrConst: /(?s)(^'[^'\\]*(?:\\.[^'\\]*)*')|(^"[^"\\]*(?:\\.[^"\\]*)*")/;
Annotation: /@[a-zA-Z0-9_]+/;
WS: /\s+/;
CommentLine: /\/\/.*/;
NotComment: /((\*[^\/])|[^\s*\/]|\/[^\*])+/;