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
块的输入看起来等于一个 As
块 aaaaaa
.
引入句法谓词并不能解决这个问题!在我看来,您的问题只有两种解决方案。
- 提供一些 'syntactic sugar' 例如通过用分号或任何其他符号关闭
As
规则。规则如下所示:As: 'a'+ ';';
注意避免 a 的单词之间出现空格,并确保单词后至少出现一个空格:
Group: content = (As | Bs) WS+;
As hidden(): 'a'+;
Bs hidden(): 'b'+;
然后,您的语法将按预期进行编译和运行。
我正在尝试为一种语言创建 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
块的输入看起来等于一个 As
块 aaaaaa
.
引入句法谓词并不能解决这个问题!在我看来,您的问题只有两种解决方案。
- 提供一些 'syntactic sugar' 例如通过用分号或任何其他符号关闭
As
规则。规则如下所示:As: 'a'+ ';';
注意避免 a 的单词之间出现空格,并确保单词后至少出现一个空格:
Group: content = (As | Bs) WS+; As hidden(): 'a'+; Bs hidden(): 'b'+;
然后,您的语法将按预期进行编译和运行。