在' Say'

时间:2018-04-22 18:55:22

标签: xtext

我正在编写语法以识别以下输入

Say Hello Boss  
Hello friend

这是我完整的语法

带有org.xtext.example.second.MyDsl

语法org.eclipse.xtext.common.Terminals

生成myDsl "http://www.xtext.org/example/second/MyDsl"

示例:

statements+=Statement*;

说明:

(IDLABEL)? Directives;

指令:

TAG1 | TAG2 | TAG3 | TAG4;

TAG1: tag=('Hi'|'Hello') IDLABEL;

TAG2: tag=('Tag2') IDLABEL;

TAG3: tag=('Tag3') IDLABEL;

TAG4: tag=('Tag4') IDLABEL;

STRING_OPERANDS hidden(WS):
    ("*"|UNQUOTED|QUOTED)+;

terminal QUOTED:
    "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'";

terminal UNQUOTED:
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '-' | '*' | "/" | "\\" | '(' | ')' | '$' | '=' |'@' |'.' | '"' |'#'|'+'|"'"|'<'|'>')*;

terminal IDLABEL:
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9'|'='|'#')*;

输入,Say Hello Boss 我收到错误"missing EOF at Say"

并输入Hello Boss 我收到错误"mismatched input 'Boss' expecting RULE_IDLABEL"

这个语法出了什么问题?

1 个答案:

答案 0 :(得分:0)

@route('/.well-known/acme-challenge/<filename>') def wellknown(filename): # Letsencrypt certbot-auto return static_file(filename, root='./static/.well-known/acme-challenge') 符合规则BossIDLABEL。如果两个规则可以匹配当前输入并且两个规则都匹配相同的前缀,则tokenizer将使用首先出现的规则。因此,输入UNQUOTED会生成Boss令牌,而不是UNQUOTED令牌。

事实上,所有有效的IDLABEL也是有效的IDLABEL,因此您永远不会获得任何UNQUOTED令牌。

要解决此问题,您可以更改IDLABELUNQUOTED的顺序,以便IDLABEL成为第一位。