Xtext - 自定义终结字符串,不带引号

时间:2015-07-23 13:49:35

标签: eclipse xtext

我是Xtext的新手,遇到了问题。

当我尝试创建没有引号的终端字符串时,我总是会出现EOF错误。

如果我在没有引号的情况下注释掉字符串的代码,我就会收到错误,一切正常。

有人可以解释一下吗? 或者给我一些提示我怎样才能更好地解决这个问题呢?

非常感谢

    // String without quotes
terminal STRINGWQ: ( ('a'..'z'|'A'..'Z')('a'..'z' | 'A'..'Z' | '_'| '-' | '§' | '?' | '!'| '@'
                                        | '\n' | ':' |'%' | '.' | '*' | '^' | ',' | '&' | '('|')'| '0'..'9'|' ')*);

其余代码

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

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


Model:
    (elements += GITest)* 
;


GITest:
    KWHeader | KWTestCase
;

// KeyWords Header
KWHeader:
    'Test' '!''?'
    ;

KWTestCase:
    'testcase' int=INT ':' title = ID |
    'Hello' names=ID '!'
;

更新: 数据类型规则

 QSTRING returns ecore::EString: //custom terminal SurveyString
        (('a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|
           'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'|' ')
          ('a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|
           'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'|
           ' '|'_'|'-'|'§'|'?'|'!'|'@'|'%'|'.'|'*'|'^'|','|'&'|'('|')'|'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9')*);

更新2:

使用数据类型规则和操作ID

代码:

STRINGWQ: ((' ')?ID)((ID)?(INT)? ' ' (ID)?);
terminal ID: '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'/'|';'|','|'#'|'!'|'§'|'$'|'%'|'&'|
              '('|')'|'='|'?'|'\\'|'*'|'+'|'.'|'-'|'>'|'<'|'|'|'['|']'|'{'|'}')*;

但是现在我遇到的问题是当STRINGWQ结束时xtext无法识别。 所以我在下一行没有获得关键字建议。 例如,如果我不使用STRINGWQ但INT我会在下一行得到建议。 但是对于STRINGWQ,我不这样做。 如何定义数据类型规则的结尾? 谢谢

2 个答案:

答案 0 :(得分:2)

您的STRINGWQ会影响终端规则ID以及基本上所有其他规则,包括关键字。有可能将整个文档作为STRINGWQ类型的单个终端令牌使用。您应该尝试将字符串建模为数据类型规则。

答案 1 :(得分:0)

这对我有用:

Property:
    id=ID | int=INT | prop=PROPERTY_VALUE | spec=SPECIAL;

PROPERTY_VALUE:
    (':');

SPECIAL:
    (' ' | '/' | ';' | ',' | '!' | '§' | '%' | '&' | '(' | ')' | '?' | '*' | '+' | '.' | '-' | '|' | '[' | ']')

我将冒号分开,因为我需要以另一种方式使用PROPERTY_VALUE。 但你也可以把它添加到特殊。