我试图为4GL语言定义一个非常暧昧的语法,并且我在使用Xtext语法进行预测时遇到了问题。
以下语法是我迄今为止所提出的:
grammar org.xtext.example.mydsl.MyDsl hidden(WS)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Program:
name=PROGRAMID
variables+=Variable*
;
Variable:
level=INT name=VARIABLEID definition=TypeDefinition;
TypeDefinition hidden():
'(' type=Datatype length=INT ')'
;
Datatype:
Alpha
| Num;
Alpha:
'A';
Num:
'N';
terminal PROGRAMID:
('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')+
;
terminal VARIABLEID:
('+')? ('a'..'z' | 'A'..'Z' | '-' | '_' | '/' | '#' | '$' | '&' | '@')
('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' | '/' | '#' | '$' | '&' | '@')*;
terminal INT returns ecore::EInt:
('0'..'9')+;
terminal STRING:
'"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"' |
"'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";
terminal WS:
(' ' | '\t' | '\r' | '\n')+;
terminal ANY_OTHER:
.;
它应该能够解析这样的东西:
PROG01
1 MYVARIABLE (A14)
但它失败了两件事。
1)不匹配的输入' MYVARIABLE'期待RULE_VARIABLEID
如果我添加一个 - 或其他东西来区别于PROGRAMID它可以工作。
2) 不匹配的输入''期待RULE_INT 输入' A14'
没有可行的选择我不能强迫它不中间有空格。
是否可以让Xtext解析这样的语法,或者我是否必须使用像ANTLR这样的东西来自己创建AST?
提前致谢!