@@ -67,7 +67,190 @@ public IFluentLexemeBuilder<IndentedWhileTokenGeneric> GetLexer()
67
67
return lexer ;
68
68
}
69
69
70
- public BuildResult < Parser < IndentedWhileTokenGeneric , WhileAST > > GetParser ( )
70
+ public BuildResult < Parser < IndentedWhileTokenGeneric , WhileAST > > GetParserWithManyOperands ( )
71
+ {
72
+ var instance = new IndentedWhileParserGeneric ( ) ;
73
+ var builder = FluentEBNFParserBuilder < IndentedWhileTokenGeneric , WhileAST > . NewBuilder ( instance , "program" , "en" ) ;
74
+
75
+ var binary = ( Func < WhileAST , Token < IndentedWhileTokenGeneric > , WhileAST , WhileAST > instanceCallback ) =>
76
+ {
77
+ Func < object [ ] , WhileAST > callback = ( object [ ] args ) =>
78
+ {
79
+ WhileAST left = ( WhileAST ) args [ 0 ] ;
80
+ Token < IndentedWhileTokenGeneric > op = ( Token < IndentedWhileTokenGeneric > ) args [ 1 ] ;
81
+ WhileAST right = ( WhileAST ) args [ 2 ] ;
82
+ return instanceCallback ( left , op , right ) ;
83
+ } ;
84
+ return callback ;
85
+ } ;
86
+
87
+ var prefix = ( Func < Token < IndentedWhileTokenGeneric > , WhileAST , WhileAST > instanceCallback ) =>
88
+ {
89
+ Func < object [ ] , WhileAST > callback = ( object [ ] args ) =>
90
+ {
91
+ Token < IndentedWhileTokenGeneric > op = ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ;
92
+ WhileAST right = ( WhileAST ) args [ 1 ] ;
93
+ return instanceCallback ( op , right ) ;
94
+ } ;
95
+ return callback ;
96
+ } ;
97
+
98
+ var postfix = ( Func < WhileAST , Token < IndentedWhileTokenGeneric > , WhileAST > instanceCallback ) =>
99
+ {
100
+ Func < object [ ] , WhileAST > callback = ( object [ ] args ) =>
101
+ {
102
+ Token < IndentedWhileTokenGeneric > op = ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ;
103
+ WhileAST right = ( WhileAST ) args [ 1 ] ;
104
+ return instanceCallback ( right , op ) ;
105
+ } ;
106
+ return callback ;
107
+ } ;
108
+
109
+ var comparisonCallback = binary ( ( left , op , right ) =>
110
+ {
111
+ return instance . binaryComparisonExpression ( left , op , right ) ;
112
+ } ) ;
113
+
114
+ var stringCallback = binary ( ( left , op , right ) =>
115
+ {
116
+ return instance . binaryStringExpression ( left , op , right ) ;
117
+ } ) ;
118
+ var factorCallback = binary ( ( left , op , right ) =>
119
+ {
120
+ return instance . binaryFactorNumericExpression ( left , op , right ) ;
121
+ } ) ;
122
+ var termCallback = binary ( ( left , op , right ) =>
123
+ {
124
+ return instance . binaryTermNumericExpression ( left , op , right ) ;
125
+ } ) ;
126
+
127
+
128
+ var parser = builder
129
+ . UseAutoCloseIndentations ( true )
130
+ . UseMemoization ( true )
131
+ // expressions
132
+ . Right ( IndentedWhileTokenGeneric . LESSER , 50 , comparisonCallback )
133
+ . Right ( IndentedWhileTokenGeneric . GREATER , 50 , comparisonCallback )
134
+ . Right ( IndentedWhileTokenGeneric . EQUALS , 50 , comparisonCallback )
135
+ . Right ( IndentedWhileTokenGeneric . DIFFERENT , 50 , comparisonCallback )
136
+ . Right ( IndentedWhileTokenGeneric . CONCAT , 50 , stringCallback )
137
+ . Right ( IndentedWhileTokenGeneric . PLUS , 10 , termCallback )
138
+ . Right ( IndentedWhileTokenGeneric . MINUS , 10 , termCallback )
139
+ . Right ( IndentedWhileTokenGeneric . TIMES , 50 , factorCallback )
140
+ . Right ( IndentedWhileTokenGeneric . DIVIDE , 50 , factorCallback )
141
+ . Prefix ( IndentedWhileTokenGeneric . MINUS , 100 ,
142
+ prefix ( ( op , value ) => instance . unaryNumericExpression ( op , value ) ) )
143
+ . Right ( IndentedWhileTokenGeneric . OR , 10 ,
144
+ binary ( ( left , op , right ) => instance . binaryOrExpression ( left , op , right ) ) )
145
+ . Right ( IndentedWhileTokenGeneric . AND , 50 ,
146
+ binary ( ( left , op , right ) => instance . binaryAndExpression ( left , op , right ) ) )
147
+ . Prefix ( IndentedWhileTokenGeneric . NOT , 100 , prefix ( ( op , value ) => instance . unaryNotExpression ( op , value ) ) )
148
+ // operands
149
+ . Operand ( "int : INT" , ( args ) =>
150
+ {
151
+ return instance . PrimaryInt ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
152
+ } )
153
+ . Operand ( "id : IDENTIFIER" , ( args ) =>
154
+ {
155
+ return instance . PrimaryId ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
156
+ } )
157
+ . Operand ( "bool : [TRUE|FALSE]" , ( args ) =>
158
+ {
159
+ return instance . PrimaryBool ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
160
+ } )
161
+ . Operand ( "group : OPEN_PAREN[d] IndentedWhileParserGeneric_expressions CLOSE_PAREN[d]" , args =>
162
+ {
163
+ return ( WhileAST ) args [ 0 ] ;
164
+ } )
165
+ . Operand (
166
+ "ternary : QUESTION[d] IndentedWhileParserGeneric_expressions ARROW[d] IndentedWhileParserGeneric_expressions COLON[d] IndentedWhileParserGeneric_expressions" ,
167
+ args =>
168
+ {
169
+ var condition = ( WhileAST ) args [ 0 ] ;
170
+ var ifTrue = ( WhileAST ) args [ 1 ] ;
171
+ var ifFalse = ( WhileAST ) args [ 2 ] ;
172
+ return instance . TernaryQuestion ( condition , ifTrue , ifFalse ) ;
173
+ } )
174
+ // fstrings
175
+ . Operand ( "fstring : OPEN_FSTRING[d] fstring_element* CLOSE_FSTRING[d]" , args =>
176
+ {
177
+ var elements = ( List < WhileAST > ) args [ 0 ] ;
178
+ return instance . fstring ( elements ) ;
179
+ ;
180
+ } )
181
+ . Production ( "fstring_element : FSTRING_CONTENT" , args =>
182
+ {
183
+ return instance . FStringContent ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
184
+ } )
185
+ . Production (
186
+ "fstring_element : OPEN_FSTRING_EXPPRESSION[d] IndentedWhileParserGeneric_expressions CLOSE_FSTRING_EXPPRESSION[d]" ,
187
+ args =>
188
+ {
189
+ return ( WhileAST ) args [ 0 ] ;
190
+ } )
191
+ // main
192
+ . Production ( "program: sequence" , args =>
193
+ {
194
+ return ( WhileAST ) args [ 0 ] ;
195
+ } )
196
+ . Production ( "block : INDENT[d] sequence UINDENT[d]" , args =>
197
+ {
198
+ return ( WhileAST ) args [ 0 ] ;
199
+ } )
200
+ // statements
201
+ . Production ( "statement : block" , args =>
202
+ {
203
+ return ( WhileAST ) args [ 0 ] ;
204
+ } )
205
+ . Production ( "sequence: statement*" , args =>
206
+ {
207
+ return instance . sequence ( ( List < WhileAST > ) args [ 0 ] ) ;
208
+ } )
209
+ . Production ( "statement: IF[d] IndentedWhileParserGeneric_expressions THEN[d] block (ELSE[d] block)?" ,
210
+ args =>
211
+ {
212
+ var condition = ( WhileAST ) args [ 0 ] ;
213
+ var ifTrue = ( WhileAST ) args [ 1 ] ;
214
+ var ifFalse = ( ValueOption < Group < IndentedWhileTokenGeneric , WhileAST > > ) args [ 2 ] ;
215
+ return instance . ifStmt ( condition , ifTrue , ifFalse ) ;
216
+ } )
217
+ . Production ( "statement: WHILE[d] IndentedWhileParserGeneric_expressions DO[d] block" , args =>
218
+ {
219
+ var condition = ( WhileAST ) args [ 0 ] ;
220
+ var block = ( WhileAST ) args [ 1 ] ;
221
+ return instance . whileStmt ( condition , block ) ;
222
+ } )
223
+ . Production ( "statement: IDENTIFIER ASSIGN[d] IndentedWhileParserGeneric_expressions" , args =>
224
+ {
225
+ var id = ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ;
226
+ var value = ( Expression ) args [ 1 ] ;
227
+ return instance . assignStmt ( id , value ) ;
228
+ } )
229
+ . Production ( "statement: SKIP[d]" , args =>
230
+ {
231
+ return new SkipStatement ( ) ;
232
+ } )
233
+ . Production ( "statement: RETURN[d] IndentedWhileParserGeneric_expressions" , args =>
234
+ {
235
+ var value = ( Expression ) args [ 0 ] ;
236
+ return new ReturnStatement ( value ) ;
237
+ } )
238
+ . Production ( "statement: PRINT[d] IndentedWhileParserGeneric_expressions" , args =>
239
+ {
240
+ var value = ( Expression ) args [ 0 ] ;
241
+ return new PrintStatement ( value ) ;
242
+ } )
243
+ . WithLexerbuilder ( GetLexer ( ) )
244
+ . BuildParser ( ) ;
245
+
246
+
247
+ return parser ;
248
+
249
+
250
+
251
+ }
252
+
253
+ public BuildResult < Parser < IndentedWhileTokenGeneric , WhileAST > > GetParserWithSingleOperand ( )
71
254
{
72
255
var instance = new IndentedWhileParserGeneric ( ) ;
73
256
var builder = FluentEBNFParserBuilder < IndentedWhileTokenGeneric , WhileAST > . NewBuilder ( instance , "program" , "en" ) ;
@@ -154,6 +337,10 @@ public BuildResult<Parser<IndentedWhileTokenGeneric, WhileAST>> GetParser()
154
337
{
155
338
return instance . PrimaryId ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
156
339
} )
340
+ . Operand ( "operand : primary" , ( args ) =>
341
+ {
342
+ return ( WhileAST ) args [ 0 ] ;
343
+ } )
157
344
. Production ( "primary : [TRUE|FALSE]" , ( args ) =>
158
345
{
159
346
return instance . PrimaryBool ( ( Token < IndentedWhileTokenGeneric > ) args [ 0 ] ) ;
@@ -171,10 +358,6 @@ public BuildResult<Parser<IndentedWhileTokenGeneric, WhileAST>> GetParser()
171
358
var ifFalse = ( WhileAST ) args [ 2 ] ;
172
359
return instance . TernaryQuestion ( condition , ifTrue , ifFalse ) ;
173
360
} )
174
- . Operand ( "operand: primary" , ( args ) =>
175
- {
176
- return ( WhileAST ) args [ 0 ] ;
177
- } )
178
361
// fstrings
179
362
. Production ( "primary : OPEN_FSTRING[d] fstring_element* CLOSE_FSTRING[d]" , args =>
180
363
{
0 commit comments