我一直在研究Z Notation(ISO UTF版本)的antlr4语法,规范要求lex阶段,然后是“2阶段”解析。 首先将它变成一堆NAME(或DECORWORD)标记,然后根据spec的解析器语法中的operatorTemplate规则解析生成的标记,替换相应的标记,然后最终解析新修改的标记流以获取AST。
我有上述工作,但我无法弄清楚如何动态设置解析器规则的优先级和关联性,因此解析树是错误的。
运算符语法看起来像(数字是优先的):
-generic 5 rightassoc (_ → _)
-function 65 rightassoc (_ ◁ _)
我没有看到任何API在规则上设置关联性,所以我尝试使用语义谓词,例如:
expression:
: {ZSupport.isLeftAssociative()}? expression I expression
| <assoc=right> expression i expression
;
或
expression:
: {ZSupport.isLeftAssociative()}? expression i expression
| <assoc=right> {ZSupport.isRightAssociative()}? expression I expression
;
然后我得到“以下几套规则是相互左递归的[表达式]”
可以这样做吗?
答案 0 :(得分:0)
我能够通过移动语义谓词来实现这一目标:
expression:
: expression {ZSupport.isLeftAssociative()}? I expression
| <assoc=right> expression I expression
;
我的印象是,根据这个讨论,这不会起作用: https://stackoverflow.com/a/23677069/7711235
...但它似乎在我的所有测试用例中都能正常工作......