为了更好地理解Xtext,我正在编写语法并且遇到了障碍。我把它归结为以下场景。我有一些输入,如:
thing {abc}
{def}
可能有大括号中的其他语言元素(例如ID)后面跟着关键字(例如'thing')。或者,大括号内可能只有一块内容。这个内容应该简单地一起传递给解析器。
如果我尝试这样的话:
Model: (things+=AThing | blocks+=ABlock)*;
AThing : 'thing' '{' name = ID '}';
ABlock : block=BLOCK;
terminal BLOCK:'{' -> '}';
并解析上面的示例文本,我收到一个错误:
'mismatched input '{abc}' expecting '{'' on ABlock, offset 6, length 5
所以,'{abc}'与BLOCK终端规则匹配,我理解。但是,如何更改语法以正确处理样本输入?我已经在这个问题上挣扎了一段时间,并且已经空了。所以这是我错过的非常简单的事情,或者问题非常复杂,我没有意识到。任何启蒙都会受到高度赞赏。
答案 0 :(得分:0)
解析分为两个阶段:标记生成器和词法分析。在第一个中,文本输入被划分为标记,在第二个中,标记与词法规则匹配。大致类似(使用某种任意语言):
第一阶段:
text: class X { this ; }
----- --- --- ---- --- ---
tokens: ID ID LB ID SC RB
第二阶段:
是否存在以“类”字符串开头的规则?
YES: Is the next expected token an ID?
YES: Is the next expected token a LB?
...
NO: Is there another rule that starts with 'class'?
...
NO: Is there a rule that starts with an ID token?
...
词法分析器的实现有点复杂,但是我希望您能理解。
语法问题是,在第一阶段使用了术语BLOCK规则,因此您得到了
thing {abc} {def}
----- ----- -----
ID BLOCK BLOCK
这就是为什么错误消息显示“ {abc}”而不是“ {”的原因。词法分析器匹配该事物,并期望下一个标记为“ {”,但它有一个BLOCK。 如果您希望在块内输入任意文本,我认为您不能使用'{'来标识事物的名称。
答案 1 :(得分:0)