Xtext语法:“永远无法匹配以下替代方案”

时间:2014-02-18 15:23:06

标签: xtext

我遇到了一个问题,我在构建一个相当复杂的语法时含糊不清。在这里发帖太复杂了,所以我减少了我的问题以帮助理解。

我收到以下错误:

error(201): ../org.xtext.example.mydsl.ui/src-gen/org/xtext/example/mydsl/ui/contentassist/antlr/internal/InternalMyDsl.g:398:1: The following alternatives can never be matched: 2

从这个语法:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    (contents+=ModelMember)*;


ModelMember:  
    Field | Assignment | Static | Class
;

Static:
    "static" type=TypeDef name=ID
;

Class:
    "class" name=ID "{"
        (fields+=Field)*
    "}"
;

Field:
    "var" type=TypeDef name=ID
;

TypeDef:
    {Primtive} ("String" | "int") |
    {Object} clazz=[Class]
;

Reference:
    (
        {StaticField} static=[Static] (withDiamond?="<>")? 
        |
        {DynamicField} field=[Field]
    )
;

ObjectReference:
    reference=Reference ({ObjectReference.target=current} '.' reference=Reference)*

;

Assignment:
    field=ObjectReference "=" value=ObjectReference
;

我知道问题与Reference有关,Reference: ref=[RefType] (withDiamond?="<>")? ; RefType: Static|Field ; 正在努力解决选择哪条规则的模糊性。

我可以通过以下语法更改来编译它,但这允许我认为非法的语法:

static String a

class Person {
    String name
}

Person paul

// This should be legal
paul.name = a<>;

// This should be illegal, diamond not vaild against non-static vars
paul.name = paul.name<>;

// This sohuld be legal
paul.name = paul.name

我的用例是:

{{1}}

1 个答案:

答案 0 :(得分:1)

你的第二个语法是要走的路。钻石仅对静态变量合法的事实可以在您的语言验证器中处理。

通常,使你的语法松散,你的验证严格。这使您的语法更容易维护。它还为您的用户提供了更好的错误消息(“非静态变量不允许使用Diamand”而不是“无效输入”&lt;'“)