我正在编写语法以识别以下输入
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"
这个语法出了什么问题?
答案 0 :(得分:0)
@route('/.well-known/acme-challenge/<filename>')
def wellknown(filename): # Letsencrypt certbot-auto
return static_file(filename, root='./static/.well-known/acme-challenge')
符合规则Boss
和IDLABEL
。如果两个规则可以匹配当前输入并且两个规则都匹配相同的前缀,则tokenizer将使用首先出现的规则。因此,输入UNQUOTED
会生成Boss
令牌,而不是UNQUOTED
令牌。
事实上,所有有效的IDLABEL
也是有效的IDLABEL
,因此您永远不会获得任何UNQUOTED
令牌。
要解决此问题,您可以更改IDLABEL
和UNQUOTED
的顺序,以便IDLABEL
成为第一位。