【发布时间】:2014-08-16 16:33:04
【问题描述】:
Xtext 文档,例如这里:http://www.eclipse.org/Xtext/documentation.html#syntax 似乎只是通过给出一个示例“悬空其他问题”来解释句法谓词。我对此的幼稚解释是:如果您的语法不明确,请使用 => 选择您想要的选项。然而,我得到的结果表明它比这更复杂,在某个地方有更好的解释吗?为了试图理解发生了什么,我设计了这个简单但模棱两可的语法来进行实验(显然我不会在现实世界中这样做):
grammar com.euclideanspace.experiment.Mydsl with org.eclipse.xtext.common.Terminals
generate mydsl "http://www.euclideanspace.com/experiment/Mydsl"
Model:
opt=Option;
Option:
(ID Option1 ID)
|
(ID Option2 ID)
;
Option1:
'=='|'+=';
Option2:
'=='|'-=';
这会给出以下警告:
warning(200): ../com.euclideanspace.experiment/src-gen/com/euclideanspace/experiment/parser/antlr/internal/InternalMydsl.g:119:1: Decision can match input such as "RULE_ID '==' RULE_ID" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
warning(200): ../com.euclideanspace.experiment.ui/src-gen/com/euclideanspace/experiment/ui/contentassist/antlr/internal/InternalMydsl.g:176:1: Decision can match input such as "RULE_ID '==' RULE_ID" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
语法不明确,因为像“a == b”这样的输入可以使用 Option1 或 Option2 进行匹配。 我们可以通过在我们要为可能不明确的输入选择的选项之前添加由“=>”指示的语法谓词来删除此警告。
Option:
(ID Option1 ID)
|
=>(ID Option2 ID)
;
我们也可以像这样将句法谓词放在括号内:
Option:
(ID Option1 ID)
|
(=>ID Option2 ID)
;
这两个职位都有效,那么哪个最好?我不清楚第二种情况是如何工作的,选择一个ID而不是另一个ID也意味着Option2优于Option1。但是,如果我们将语法谓词放在 Option2 之前(这似乎很有意义,因为这是我们想要选择的选项),那么我们会收到以下警告:
Option:
(ID Option1 ID)
|
(ID =>Option2 ID)
;
警告(200):../com.euclideanspace.experiment/src-gen/com/euclideanspace/experiment/parser/antlr/internal/InternalMydsl.g:119:1:决策可以匹配输入,例如“RULE_ID” ==' RULE_ID" 使用多种选择:1、2 因此,该输入禁用了备选方案 2
所以这不仅仅是将句法谓词放在我们想要选择的选项之前的情况。我想我需要了解解析器如何扫描语法,以便我们知道在哪里切断不需要的选项。
是否有解释上述问题的句法谓词解释?句法谓词如何被动作隐藏?
马丁
【问题讨论】:
标签: xtext