Skip to content

Commit 6f57f5e

Browse files
authored
Support infix operator rules (#1836)
1 parent fb3e08c commit 6f57f5e

File tree

26 files changed

+1021
-440
lines changed

26 files changed

+1021
-440
lines changed

examples/arithmetics/src/language-server/arithmetics.langium

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,13 @@ Evaluation:
2020
expression=Expression ';';
2121

2222
Expression:
23-
Addition;
23+
BinaryExpression;
2424

25-
Addition infers Expression:
26-
Multiplication ({infer BinaryExpression.left=current} operator=('+' | '-') right=Multiplication)*;
27-
28-
Multiplication infers Expression:
29-
Exponentiation ({infer BinaryExpression.left=current} operator=('*' | '/') right=Exponentiation)*;
30-
31-
Exponentiation infers Expression:
32-
Modulo ({infer BinaryExpression.left=current} operator='^' right=Modulo)*;
33-
34-
Modulo infers Expression:
35-
PrimaryExpression ({infer BinaryExpression.left=current} operator='%' right=PrimaryExpression)*;
25+
infix BinaryExpression on PrimaryExpression:
26+
'%'
27+
> '^'
28+
> '*' | '/'
29+
> '+' | '-';
3630

3731
PrimaryExpression infers Expression:
3832
'(' Expression ')' |

examples/arithmetics/src/language-server/generated/grammar.ts

Lines changed: 40 additions & 245 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const ArithmeticsGrammar = (): Grammar => loadedArithmeticsGrammar ?? (lo
3030
"terminal": {
3131
"$type": "RuleCall",
3232
"rule": {
33-
"$ref": "#/rules@12"
33+
"$ref": "#/rules@9"
3434
},
3535
"arguments": []
3636
}
@@ -102,7 +102,7 @@ export const ArithmeticsGrammar = (): Grammar => loadedArithmeticsGrammar ?? (lo
102102
"terminal": {
103103
"$type": "RuleCall",
104104
"rule": {
105-
"$ref": "#/rules@12"
105+
"$ref": "#/rules@9"
106106
},
107107
"arguments": []
108108
}
@@ -194,7 +194,7 @@ export const ArithmeticsGrammar = (): Grammar => loadedArithmeticsGrammar ?? (lo
194194
"terminal": {
195195
"$type": "RuleCall",
196196
"rule": {
197-
"$ref": "#/rules@12"
197+
"$ref": "#/rules@9"
198198
},
199199
"arguments": []
200200
}
@@ -255,270 +255,65 @@ export const ArithmeticsGrammar = (): Grammar => loadedArithmeticsGrammar ?? (lo
255255
"wildcard": false
256256
},
257257
{
258-
"$type": "ParserRule",
259-
"name": "Addition",
260-
"inferredType": {
261-
"$type": "InferredType",
262-
"name": "Expression"
258+
"$type": "InfixRule",
259+
"name": "BinaryExpression",
260+
"call": {
261+
"$type": "RuleCall",
262+
"rule": {
263+
"$ref": "#/rules@7"
264+
},
265+
"arguments": []
263266
},
264-
"definition": {
265-
"$type": "Group",
266-
"elements": [
267-
{
268-
"$type": "RuleCall",
269-
"rule": {
270-
"$ref": "#/rules@7"
271-
},
272-
"arguments": []
273-
},
267+
"operators": {
268+
"$type": "InfixRuleOperators",
269+
"precedences": [
274270
{
275-
"$type": "Group",
276-
"elements": [
271+
"$type": "InfixRuleOperatorList",
272+
"operators": [
277273
{
278-
"$type": "Action",
279-
"inferredType": {
280-
"$type": "InferredType",
281-
"name": "BinaryExpression"
282-
},
283-
"feature": "left",
284-
"operator": "="
285-
},
286-
{
287-
"$type": "Assignment",
288-
"feature": "operator",
289-
"operator": "=",
290-
"terminal": {
291-
"$type": "Alternatives",
292-
"elements": [
293-
{
294-
"$type": "Keyword",
295-
"value": "+"
296-
},
297-
{
298-
"$type": "Keyword",
299-
"value": "-"
300-
}
301-
]
302-
}
303-
},
304-
{
305-
"$type": "Assignment",
306-
"feature": "right",
307-
"operator": "=",
308-
"terminal": {
309-
"$type": "RuleCall",
310-
"rule": {
311-
"$ref": "#/rules@7"
312-
},
313-
"arguments": []
314-
}
274+
"$type": "Keyword",
275+
"value": "%"
315276
}
316-
],
317-
"cardinality": "*"
318-
}
319-
]
320-
},
321-
"definesHiddenTokens": false,
322-
"entry": false,
323-
"fragment": false,
324-
"hiddenTokens": [],
325-
"parameters": [],
326-
"wildcard": false
327-
},
328-
{
329-
"$type": "ParserRule",
330-
"name": "Multiplication",
331-
"inferredType": {
332-
"$type": "InferredType",
333-
"name": "Expression"
334-
},
335-
"definition": {
336-
"$type": "Group",
337-
"elements": [
338-
{
339-
"$type": "RuleCall",
340-
"rule": {
341-
"$ref": "#/rules@8"
342-
},
343-
"arguments": []
277+
]
344278
},
345279
{
346-
"$type": "Group",
347-
"elements": [
348-
{
349-
"$type": "Action",
350-
"inferredType": {
351-
"$type": "InferredType",
352-
"name": "BinaryExpression"
353-
},
354-
"feature": "left",
355-
"operator": "="
356-
},
280+
"$type": "InfixRuleOperatorList",
281+
"operators": [
357282
{
358-
"$type": "Assignment",
359-
"feature": "operator",
360-
"operator": "=",
361-
"terminal": {
362-
"$type": "Alternatives",
363-
"elements": [
364-
{
365-
"$type": "Keyword",
366-
"value": "*"
367-
},
368-
{
369-
"$type": "Keyword",
370-
"value": "/"
371-
}
372-
]
373-
}
374-
},
375-
{
376-
"$type": "Assignment",
377-
"feature": "right",
378-
"operator": "=",
379-
"terminal": {
380-
"$type": "RuleCall",
381-
"rule": {
382-
"$ref": "#/rules@8"
383-
},
384-
"arguments": []
385-
}
283+
"$type": "Keyword",
284+
"value": "^"
386285
}
387-
],
388-
"cardinality": "*"
389-
}
390-
]
391-
},
392-
"definesHiddenTokens": false,
393-
"entry": false,
394-
"fragment": false,
395-
"hiddenTokens": [],
396-
"parameters": [],
397-
"wildcard": false
398-
},
399-
{
400-
"$type": "ParserRule",
401-
"name": "Exponentiation",
402-
"inferredType": {
403-
"$type": "InferredType",
404-
"name": "Expression"
405-
},
406-
"definition": {
407-
"$type": "Group",
408-
"elements": [
409-
{
410-
"$type": "RuleCall",
411-
"rule": {
412-
"$ref": "#/rules@9"
413-
},
414-
"arguments": []
286+
]
415287
},
416288
{
417-
"$type": "Group",
418-
"elements": [
419-
{
420-
"$type": "Action",
421-
"inferredType": {
422-
"$type": "InferredType",
423-
"name": "BinaryExpression"
424-
},
425-
"feature": "left",
426-
"operator": "="
427-
},
289+
"$type": "InfixRuleOperatorList",
290+
"operators": [
428291
{
429-
"$type": "Assignment",
430-
"feature": "operator",
431-
"operator": "=",
432-
"terminal": {
433-
"$type": "Keyword",
434-
"value": "^"
435-
}
292+
"$type": "Keyword",
293+
"value": "*"
436294
},
437295
{
438-
"$type": "Assignment",
439-
"feature": "right",
440-
"operator": "=",
441-
"terminal": {
442-
"$type": "RuleCall",
443-
"rule": {
444-
"$ref": "#/rules@9"
445-
},
446-
"arguments": []
447-
}
296+
"$type": "Keyword",
297+
"value": "/"
448298
}
449-
],
450-
"cardinality": "*"
451-
}
452-
]
453-
},
454-
"definesHiddenTokens": false,
455-
"entry": false,
456-
"fragment": false,
457-
"hiddenTokens": [],
458-
"parameters": [],
459-
"wildcard": false
460-
},
461-
{
462-
"$type": "ParserRule",
463-
"name": "Modulo",
464-
"inferredType": {
465-
"$type": "InferredType",
466-
"name": "Expression"
467-
},
468-
"definition": {
469-
"$type": "Group",
470-
"elements": [
471-
{
472-
"$type": "RuleCall",
473-
"rule": {
474-
"$ref": "#/rules@10"
475-
},
476-
"arguments": []
299+
]
477300
},
478301
{
479-
"$type": "Group",
480-
"elements": [
481-
{
482-
"$type": "Action",
483-
"inferredType": {
484-
"$type": "InferredType",
485-
"name": "BinaryExpression"
486-
},
487-
"feature": "left",
488-
"operator": "="
489-
},
302+
"$type": "InfixRuleOperatorList",
303+
"operators": [
490304
{
491-
"$type": "Assignment",
492-
"feature": "operator",
493-
"operator": "=",
494-
"terminal": {
495-
"$type": "Keyword",
496-
"value": "%"
497-
}
305+
"$type": "Keyword",
306+
"value": "+"
498307
},
499308
{
500-
"$type": "Assignment",
501-
"feature": "right",
502-
"operator": "=",
503-
"terminal": {
504-
"$type": "RuleCall",
505-
"rule": {
506-
"$ref": "#/rules@10"
507-
},
508-
"arguments": []
509-
}
309+
"$type": "Keyword",
310+
"value": "-"
510311
}
511-
],
512-
"cardinality": "*"
312+
]
513313
}
514314
]
515315
},
516-
"definesHiddenTokens": false,
517-
"entry": false,
518-
"fragment": false,
519-
"hiddenTokens": [],
520-
"parameters": [],
521-
"wildcard": false
316+
"parameters": []
522317
},
523318
{
524319
"$type": "ParserRule",
@@ -567,7 +362,7 @@ export const ArithmeticsGrammar = (): Grammar => loadedArithmeticsGrammar ?? (lo
567362
"terminal": {
568363
"$type": "RuleCall",
569364
"rule": {
570-
"$ref": "#/rules@13"
365+
"$ref": "#/rules@10"
571366
},
572367
"arguments": []
573368
}

0 commit comments

Comments
 (0)