我正在设计一种低标点语言,我希望使用以下语法支持数组声明:
512 by 512 of 255 // a 512x512 array filled with 255
100 of 0 // a 100-element array filled with 0
expr1 by expr2 by expr3 ... by exprN of exprFill
这些数组声明只是众多声明中的一种。
我很难弄清楚如何编写语法规则。我把我的语法简化为最简单的再现我麻烦的东西:
grammar Dimensions;
program
: expression EOF
;
expression
: expression (BY expression)* OF expression
| INT
;
BY : 'by';
OF : 'of';
INT : [0-9]+;
WHITESPACE : [ \t\n\r]+ -> skip;
当我输入10 of 1
时,我得到了我想要的解析:
当我以20 by 10 of 1
方式投放时,中间的expression
非终端会向10 of 1
投降,不会留下任何与规则OF expression
匹配的内容:
我收到以下警告:
line 2:0 mismatched input '<EOF>' expecting 'of'
我想看的解析是
(program (expression (expression 20) by (expression 10) of (expression 1)) <EOF>)
有没有办法可以重新制定语法来实现这一目标?我觉得我需要的是BY和OF之间的权利关联,但我不知道如何在两个运营商之间表达这一点。
答案 0 :(得分:0)
经过一些非智力实验,我想出了一些似乎产生我想要的解析的作品:
expression
:<assoc=right> expression (BY expression)+ OF expression
|<assoc=right> expression OF expression
| INT
;
我不知道是否有一种方法可以用一次制作来表达它。