xtext 分组语法警告

xtext grouping grammar warning

我正在尝试为一种语言创建 xtext 语法,该语言有多行可以根据其结构组合在一起。生成语法时,我无法从语法中删除警告。作为示例,我将以下具有相同问题的语法放在一起:

Groups: groups += Group*;

Group: content = (As | Bs);

As: 'a'+;

Bs: 'b'+;

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

我只希望它是 1 组,每组 4 个。但是没有地方放'=>'谓词?

有谁知道如何重构此语法以消除歧义?

是的,你的语法有歧义。您的 paser 可以以不同的方式匹配 'aaaa'。要解决它,您可以添加一个语法谓词,如下所示:

Groups: groups += Group*;

Group: content = (As | Bs);

As: =>'a'+;

Bs: =>'b'+;

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

您的语法存在问题,在您的语法中可以解析多个 a 列表。示例:

a
aa
aaa

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

引入句法谓词并不能解决这个问题!在我看来,您的问题只有两种解决方案。

  1. 提供一些 'syntactic sugar' 例如通过用分号或任何其他符号关闭 As 规则。规则如下所示:As: 'a'+ ';';
  2. 注意避免 a 的单词之间出现空格,并确保单词后至少出现一个空格:

    Group: content = (As | Bs) WS+;
    As hidden(): 'a'+;
    Bs hidden(): 'b'+;
    

    然后,您的语法将按预期进行编译和运行。