句法谓词如何工作?

时间:2014-08-16 16:33:05

标签: xtext

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也意味着Option2优于Option1。但是,如果我们将语法谓词放在Option2之前(这似乎有意义,因为这是我们想要选择的选项),那么我们会得到以下警告:

Option:
 (ID Option1 ID)
 |
 (ID =>Option2 ID)
 ;

警告(200):../ comhtml.sidanspace.experiment/src-gen/com/euclideanspace/experiment/parser/antlr/internal/InternalMydsl.g:119:1:决策可以匹配输入,例如“RULE_ID” =='RULE_ID“使用多种选择:1,2 结果,对该输入禁用了备选方案2

因此,不仅仅是在我们想要选择的选项之前放置语法谓词的情况。我想我需要了解解析器如何扫描语法,以便我们知道在哪里切断不需要的选项。

是否有解释上述问题的句法谓词的解释?句法谓词如何被动作隐藏?

马丁

1 个答案:

答案 0 :(得分:2)

必须在没有谓词的备选方案之前列出具有谓词的备选方案。例如。你的规则选项应该是这样的:

Option:
    ID =>Option2 ID) 
  | ID Option1 ID;

请注意' =='在这种情况下,令牌永远不会作为Option1的一部分使用,因为它始终是Option2。您可能希望重构语法以删除那里的重复分支,这将使您免于首先使用谓词。