xtext分组语法警告

时间:2015-11-04 05:31:38

标签: parsing compiler-construction xtext

我正在尝试为具有多行的语言创建xtext语法,这些行可以根据其结构组合在一起。当它生成时,我无法摆脱语法中的警告。作为一个例子,我把以下语法放在一起有同样的问题:

Groups: groups += Group*;

Group: content = (As | Bs);

As: 'a'+;

Bs: 'b'+;

例如对于输入“aaaa”,如果它是一组4个或两个组的2个(或其他替代方案),则它是不明确的。

我只想让它成为1组4 a。但是没有地方可以放'=>'谓词?

有没有人知道如何重构这个语法,以消除歧义?

2 个答案:

答案 0 :(得分:1)

是的,你的语法含糊不清。你的paser可以用不同的方式匹配'aaaa'。要解决它,您可以添加语法谓词如下:

Groups: groups += Group*;

Group: content = (As | Bs);

As: =>'a'+;

Bs: =>'b'+;

答案 1 :(得分:1)

添加语法谓词并不能解决语法中的含糊之处。问题是词法分析器提供的令牌流不包含任何一个组是否完整的信息。在你的情况下,有一条规则As: 'a'+;。它描述了至少一个或多个字母a的列表。每个upcomming a都会被消耗,但这些Whitespaces之间的所谓a(例如简单的空格,制表符或换行符)将被忽略。解析器将继续将下一个upcomming a置于此规则中,直到令牌流中跟随另一个字母(b)。

你的语法问题是你的语法中可以解析多个a的列表。例如:

a
aa
aaa

是语法的有效输入,但解析器不知道第一行{a}}规则在第一行中的a后结束。这是因为换行符是一个被忽略的空格!对于解析器,这三个As块的输入看起来等于一个AsAs

引入语法谓词并不能解决这个问题!我认为你的问题只有两种解决方案。

  1. 提供一些'语法糖',例如通过用分号或任何其他符号关闭aaaaaa规则。该规则如下所示:As
  2. 请注意防止单词之间出现空格,并确保单词后面至少出现一个空格:

    As: 'a'+ ';';

    然后,你的语法将编译并表现得像预期的那样。