ANTLR 语法中的歧义
AntlrWorks 表示输入 {'AND','OR'..'XOR'}
可以通过两个替代项进行匹配。即使有图形显示,我也无法弄清楚比赛是如何发生的! 下面的语法到底是如何出现歧义的,有没有办法消除它?
grammar testg;
rul : contains_expr ;
contains_expr: 'CONTAINS' contains_expression
//'CONTAINS' contains_or
;
contains_expression : primary (('OR'|'AND'|'XOR') primary)*
;
primary options{backtrack = true;}
: '(' contains_expression ')'
| class_expression
;
class_expression : simple_class_expr
| '(' simple_class_expr contains_expr ')'
|( simple_class_expr contains_expr)
;
simple_class_expr: identifier // RM_TYPE_NAME
| identifier identifier // RM_TYPE_NAME variable
| archetype_class_expr
| versioned_class_expression
| version_class_expression
// | identified_obj_expression // need to be used once VersionedClassExpr is removed
;
identifier
: ID
;
archetype_class_expr
: '.ace'
;
versioned_class_expression
: '.vce'
;
version_class_expression
: '.vnce'
;
temp :
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
AntlrWorks says that input {'AND','OR'..'XOR'}
can be matched by two alternatives. Even with the graphical display, I could not figure out how the match happens!
How on earth the ambiguity occurs in the grammar below, and is there a way to remove it?
grammar testg;
rul : contains_expr ;
contains_expr: 'CONTAINS' contains_expression
//'CONTAINS' contains_or
;
contains_expression : primary (('OR'|'AND'|'XOR') primary)*
;
primary options{backtrack = true;}
: '(' contains_expression ')'
| class_expression
;
class_expression : simple_class_expr
| '(' simple_class_expr contains_expr ')'
|( simple_class_expr contains_expr)
;
simple_class_expr: identifier // RM_TYPE_NAME
| identifier identifier // RM_TYPE_NAME variable
| archetype_class_expr
| versioned_class_expression
| version_class_expression
// | identified_obj_expression // need to be used once VersionedClassExpr is removed
;
identifier
: ID
;
archetype_class_expr
: '.ace'
;
versioned_class_expression
: '.vce'
;
version_class_expression
: '.vnce'
;
temp :
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您希望您的语法如何解析
CONTAINS foo bar baz
?contains_expr
与CONTAINS
匹配。contains_expression
“调用”primary
。primary
“调用”class_expression
。class_expression
“调用”simple_class_expr
。simple_class_expr
可以匹配:identifier
或identifier 标识符
。因此我可以在这里看到几种可能的解析;我已将各个
simple_class_expr
匹配放入括号中:很抱歉,我对解析工具还很陌生,除了想知道什么之外,没有关于如何修复这个问题的建议
identifier 标识符
可能意味着。How would you expect your grammar to parse
CONTAINS foo bar baz
?contains_expr
matchesCONTAINS
.contains_expression
"calls"primary
.primary
"calls"class_expression
.class_expression
"calls"simple_class_expr
.simple_class_expr
can match:identifier
oridentifier identifier
.Thus I can see several possible parsings here; I've put individual
simple_class_expr
matches into parenthesis:I'm sorry to say that I'm new enough to parsing tools to not have suggestions how to fix this except wondering what
identifier identifier
might mean.