无法理解任何其他

时间:2013-03-24 06:02:39

标签: xtext

我正在尝试学习xtext,并且发现ANY_OTHER完全令人困惑,并且几乎没有问题。

我的.xtext文件中只有一个产品。

document: text = '<' ANY_OTHER* '>';

当我将其作为“eclipse应用程序”运行时,以下输入正常工作:

<>
< >
<.>
<....>
<.. ..>

但是后续显示失败:

<a>

错误无关输入'a'期待'&gt;'

Q1)为什么ANY_OTHER匹配文字'。'字符吗

我尝试将ANY_OTHER重写为

terminal ANY_OTHER: .;

我认为这是 Common Terminals here中的原始定义。

现在行为发生了变化。输入错误 消失了。但如果我试试

<aa>

,错误无关输入'aa'期待'&gt;'

Q2)为什么覆盖ANY_OTHER会改变行为?

Q3)为什么'。'处理方式与'a'不同? &LT; ..&GT;被接受,但不是。

1 个答案:

答案 0 :(得分:2)

我将在一个答案中回答你的三个问题,因为这在这里是有道理的。

默认情况下,语法的第一行看起来像

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

除非您手动更改。我想你的看起来仍然像这样。这意味着,默认情况下,您自己的语法将使用org.eclipse.xtext.common.Terminals,因此您是对的。 ANY_OTHER在“common”语法中指定。

根据规定的规则:单身。匹配一个字符。除此规则外,您还可以在“常用”语法中找到ID规则,该规则匹配所有文本字符和其他一些文本字符。重要的是,ID规则本身包含数量,而ANY_OTHER规则仅匹配一个单个字符。因此,默认情况下,规则将匹配这些示例

A   --> 1 instance of ID
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 2 instances of ID, 1 instance of ANY_OTHER

覆盖ANY_OTHER规则时,解析顺序会更改。您可以在文档中找到有关此内容的一些信息。这会导致不同的行为:

A   --> 1 instance of ANY_OTHER
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 3 instances of ANY_OTHER

我希望这些信息有所帮助。