如何解决ANTLR4:遵循什么设计模式?
我有一个ANTR4规则“表达式”,可以是“数学”或“比较”,但是“比较”可以包含“数学”。这是一个具体的代码:
expression
: ID
| maths
| comparison
;
maths
: maths_atom ((PLUS | MINUS) maths_atom) ? // "?" because in fact there is first multiplication then pow and I don't want to force a multiplication to make an addition
;
maths_atom
: NUMBER
| ID
| OPEN_PAR expression CLOSE_PAR
;
comparison
: comp_atom ((EQUALS | NOT_EQUALS) comp_atom) ?
;
comp_atom
: ID
| maths // here is the expression of interest
| OPEN_PAR expression CLOSE_PAR
;
例如,如果我输入6
作为输入,这对于分析树就很好了,因为它检测到maths
。但是,在 Intellij Idea 的ANTLR4插件中,它将我的expression
规则标记为红色-模糊。我应该告别一棵简短的分析树,只允许maths
中的comparison
槽expression
到现在就不再那么模棱两可了吗?
解决方法
问题在于,当解析器看到6
(即NUMBER
)时,它有两种通过语法到达它的路径:
expression - maths - maths_atom - NUMBER
或
expression - comparison - comp_atom - NUMBER
这种模糊性会触发您看到的错误。
您可以通过展平解析器语法as shown in this tutorial来解决此问题:
start
: expr | <EOF>
;
expr
: expr (PLUS | MINUS) expr # ADDGRP
| expr (EQUALS | NOT_EQUALS) expr # COMPGRP
| OPEN_PAR expression CLOSE_PAR # PARENGRP
| NUMBER # NUM
| ID # IDENT
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。