2015-11-04 43 views
1

我正在尝试为一种语言创建xtext语法,该语言具有可根据其结构分组在一起的多行。在生成语法时,我无法摆脱语法警告。作为一个例子我已经把以下语法具有相同的问题:xtext分组语法警告

Groups: groups += Group*; 

Group: content = (As | Bs); 

As: 'a'+; 

Bs: 'b'+; 

例如,对于输入“AAAA”它暧昧如果一个组的4层a的或两个基团的2的(或其他选择)。

我只想让它成为4组的一组。但是没有地方放置'=>'谓词?

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

回答

1

是的,你的语法是不明确的。你的paser可以用不同的方式匹配'aaaa'。为了解决这个问题,你可以添加一个语法谓词如下:

Groups: groups += Group*; 

Group: content = (As | Bs); 

As: =>'a'+; 

Bs: =>'b'+; 
+0

太棒了,谢谢,我不确定如何做谓词 –

1

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

您的语法问题在于,您的文法中可能会分析多于一个a的列表。例如:

a 
aa 
aaa 

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

引入句法谓词并不能解决这个问题!对于我的意见,你的问题只有两个解决方案。

  1. 提供一些'语法糖'例如通过用分号或任何其他符号关闭As规则。该规则是这样的:As: 'a'+ ';';
  2. 请小心,防止公司的一个词之间的空格,并确保至少有一个空格一个单词后occure:

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

    然后,你的语法进行编译和行为像打算一样。