1

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

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

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

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

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

但以下出现失败:

<a>

错误无关输入 'a' 期望 '>'

Q1)为什么 ANY_OTHER 匹配文字“。” 特点?

我尝试将 ANY_OTHER 覆盖为

terminal ANY_OTHER: .;

我相信这是Common Terminals here中的原始定义。

现在行为发生了变化。输入错误离开了。但如果我尝试

<aa>

, 给出错误无关输入 'aa' 期望 '>'

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

Q3)为什么是“。” 与“a”的处理方式不同?<..> 被接受,但不是。

4

1 回答 1

2

我将在一个答案中回答您的三个问题,因为这在这里很有意义。

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

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

除非您手动更改它。我猜你的还是这个样子。这意味着,您自己的语法将默认使用 org.eclipse.xtext.common.Terminals,所以您是对的。ANY_OTHER 在“通用”语法中指定。

根据规定规则:单。匹配一个字符。除此规则外,您还可以在“通用”语法中找到一个 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

我希望这个信息帮助。

于 2013-03-24T09:16:56.270 回答