This repository has been archived by the owner on Aug 4, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
RexxParser.g4
257 lines (252 loc) · 11.4 KB
/
RexxParser.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
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
parser grammar RexxParser;
options { tokenVocab=RexxLexer; }
file : program_ EOF ;
program_ : ncl? instruction_list? ;
ncl : null_clause+ ;
null_clause : delim+ label_list?
| label_list
| include_statement
;
delim : SEMICOL
| EOL
;
label_list : ( label COLON delim* )+ ;
label : VAR_SYMBOL
| CONST_SYMBOL
| NUMBER
;
include_statement : STMT_INCLUDE ;
instruction_list : instruction+ ;
instruction : group_
| single_instruction ncl?
;
single_instruction : assignment
| keyword_instruction
| command_
;
assignment : ( VAR_SYMBOL | SPECIAL_VAR | CONST_SYMBOL ) EQ expression ;
keyword_instruction : address_
| arg_
| call_
| drop_
| exit_
| interpret_
| iterate_
| leave_
| nop_
| numeric_
| options_
| parse_
| procedure_
| pull_
| push_
| queue_
| return_
| say_
| signal_
| trace_
| upper_
;
command_ : expression ;
group_ : do_
| if_
| select_
;
do_ : KWD_DO do_rep? do_cond? ncl
instruction_list?
KWD_END var_symbol? ncl? ;
do_rep : assignment do_cnt?
| KWD_FOREVER
| expression
;
do_cnt : dot dob? dof?
| dot dof? dob?
| dob dot? dof?
| dob dof? dot?
| dof dot? dob?
| dof dob? dot?
;
dot : KWD_TO expression ;
dob : KWD_BY expression ;
dof : KWD_FOR expression ;
do_cond : KWD_WHILE expression
| KWD_UNTIL expression
;
if_ : KWD_IF expression delim* then_ (delim+ else_)? ;
then_ : KWD_THEN ncl? instruction ;
else_ : KWD_ELSE ncl? instruction ;
select_ : KWD_SELECT delim+ select_body KWD_END ncl? ;
select_body : when_+ otherwise_? ;
when_ : KWD_WHEN expression delim* then_ ;
otherwise_ : KWD_OTHERWISE delim* instruction_list? ;
/*
Note: The next part concentrates on the instructions.
It leaves unspecified the various forms of symbol, template and expression. */
address_ : KWD_ADDRESS
( taken_constant expression? | valueexp )?
;
taken_constant : symbol
| STRING
;
valueexp : KWD_VALUE expression ;
arg_ : KWD_ARG template_list? ;
call_ : KWD_CALL ( callon_spec | function_name call_parms? ) ;
callon_spec : KWD_ON callable_condition ( KWD_NAME function_name )?
| KWD_OFF callable_condition
;
callable_condition : KWD_ERROR
| KWD_FAILURE
| KWD_HALT
;
call_parms : BR_O expression_list? BR_C
| expression_list
;
expression_list : COMMA* expression
( COMMA+ expression )* ;
drop_ : KWD_DROP variable_list ;
variable_list : ( vref | var_symbol )+ ;
vref : BR_O var_symbol BR_C ;
var_symbol : VAR_SYMBOL
| SPECIAL_VAR
;
exit_ : KWD_EXIT expression? ;
interpret_ : KWD_INTERPRET expression ;
iterate_ : KWD_ITERATE var_symbol? ;
leave_ : KWD_LEAVE var_symbol? ;
nop_ : KWD_NOP ;
numeric_ : KWD_NUMERIC ( numeric_digits | numeric_form | numeric_fuzz ) ;
numeric_digits : KWD_DIGITS expression? ;
numeric_form : KWD_FORM
( KWD_ENGINEERING
| KWD_SCIENTIFIC
| valueexp
| expression
)?
;
numeric_fuzz : KWD_FUZZ expression? ;
options_ : KWD_OPTIONS expression ;
parse_ : KWD_PARSE KWD_UPPER? parse_type template_list? ;
parse_type : parse_key
| parse_value
| parse_var
;
parse_key : KWD_ARG
| KWD_EXTERNAL
| KWD_NUMERIC
| KWD_PULL
| KWD_SOURCE
| KWD_VERSION
;
parse_value : KWD_VALUE expression? KWD_WITH ;
parse_var : KWD_VAR var_symbol ;
procedure_ : KWD_PROCEDURE ( KWD_EXPOSE variable_list )? ;
pull_ : KWD_PULL template_list? ;
push_ : KWD_PUSH expression? ;
queue_ : KWD_QUEUE expression? ;
return_ : KWD_RETURN expression? ;
say_ : KWD_SAY expression? ;
signal_ : KWD_SIGNAL ( signal_spec | valueexp | taken_constant ) ;
signal_spec : KWD_ON condition ( KWD_NAME function_name )?
| KWD_OFF condition
;
condition : callable_condition
| KWD_NOVALUE
| KWD_SYNTAX
;
trace_ : KWD_TRACE
( taken_constant
| valueexp
| expression
| KWD_ERROR
| KWD_FAILURE
| KWD_OFF
)
;
upper_ : KWD_UPPER var_symbol+ ; // if stem -> error (cannot do 'upper j.')
/* Note: The next section describes templates. */
template_list : COMMA* template_ ( COMMA+ template_ )* ;
template_ : ( trigger_ | target_ )+ ;
target_ : VAR_SYMBOL
| SPECIAL_VAR
| STOP
;
trigger_ : pattern_
| positional_
;
pattern_ : STRING
| vref
;
positional_ : absolute_positional
| relative_positional
;
absolute_positional : NUMBER
| EQ position_
;
position_ : NUMBER
| vref
;
relative_positional : (PLUS | MINUS) position_ ;
// Note: The final part specifies the various forms of symbol, and expression.
symbol : var_symbol
| CONST_SYMBOL
| NUMBER
;
expression : and_expression
( or_operator and_expression )* ;
or_operator : OR
| XOR
;
and_expression : comparison ( AND comparison )* ;
comparison : concatenation ( comparison_operator concatenation )* ;
comparison_operator : normal_compare
| strict_compare
;
normal_compare : EQ
| CMP_NEq
| CMP_LM
| CMP_ML
| CMP_M
| CMP_L
| CMP_MEq
| CMP_LEq
| CMP_NM
| CMP_NL
;
strict_compare : CMPS_Eq
| CMPS_Neq
| CMPS_M
| CMPS_L
| CMPS_MEq
| CMPS_LEq
| CMPS_NM
| CMPS_NL
;
concatenation : addition ( CONCAT? addition )* ;
addition : multiplication ( additive_operator multiplication )* ;
additive_operator : PLUS
| MINUS
;
multiplication : power_expression ( multiplicative_operator power_expression )* ;
multiplicative_operator : MUL
| DIV
| QUOTINENT
| REMAINDER
;
power_expression : prefix_expression ( POW prefix_expression )* ;
prefix_expression : ( PLUS | MINUS | NOT )* term ;
term : function_
| BR_O expression BR_C
| symbol
| STRING
;
function_ : function_name function_parameters ;
function_name : KWD_ADDRESS
| KWD_ARG
| KWD_DIGITS
| KWD_FORM
| KWD_FUZZ
| KWD_TRACE
| KWD_VALUE
| taken_constant
;
function_parameters : BR_O expression_list? BR_C ;