我遇到了一个问题,我在构建一个相当复杂的语法时含糊不清。在这里发帖太复杂了,所以我减少了我的问题以帮助理解。
我收到以下错误:
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}}
答案 0 :(得分:1)
你的第二个语法是要走的路。钻石仅对静态变量合法的事实可以在您的语言验证器中处理。
通常,使你的语法松散,你的验证严格。这使您的语法更容易维护。它还为您的用户提供了更好的错误消息(“非静态变量不允许使用Diamand”而不是“无效输入”&lt;'“)