解析一种暧昧的语言

时间:2017-01-26 17:17:33

标签: xtext

我试图为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?

提前致谢!

0 个答案:

没有答案