【问题标题】:How do Syntactic Predicates Work?句法谓词如何工作?
【发布时间】: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


    【解决方案1】:

    带有谓词的选项必须列在不带谓词的选项之前。例如。你的规则选项应该是这样的:

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

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

    【讨论】:

    • 感谢您的回复@Sebastian,它确实有帮助,但我仍然发现很难获得正在发生的事情的心理模型。我们是否要考虑软件单步执行一条规则,当它发现“=>”时,它会强制任何重复的选择在其右侧包含该元素?即使 Xtext 的工作方式不同,我是否需要研究 Antlr3 才能正确理解这一点?如果 xtext 文档中有此级别的详细信息(或者我错过了它?),那将会有所帮助。
    • 有关 Antlr 内部处理谓词的详细信息,我建议查看 Antlr3 书。它很好地描述了算法。
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多