【发布时间】:2020-01-09 15:28:53
【问题描述】:
我的语法如下:
myg : line+ EOF ;
line : ( for_loop | command params ) NEWLINE;
for_loop : FOR WORD INT DO NEWLINE stmt_body;
stmt_body: line+ END;
params : ( param | WHITESPACE)*;
param : WORD | INT;
command : WORD;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT : [0-9] ;
WORD : (LOWERCASE | UPPERCASE | DIGIT | [_."'/\\-])+ (DIGIT)* ;
INT : DIGIT+ ;
WHITESPACE : (' ' | '\t')+ -> skip;
NEWLINE : ('\r'? '\n' | '\r')+ -> skip;
FOR: 'for';
DO: 'do';
END: 'end';
我的问题是以下 2 个在该语言中有效:
message please wait for 90 seconds
这将是一个有效的命令,打印带有单词“for”的消息。
for n 2 do
这将是for 循环的开始。
问题在于当前的词法分析器与 for 循环不匹配,因为 'for' 与首先出现的 WORD 规则匹配。
我可以通过将 FOR 规则放在 WORD 规则之前来解决这个问题,但是消息中的“for”将被 FOR 规则匹配
【问题讨论】:
-
你能限制
command不能是其他关键字之一吗?这意味着当令牌for在开头时,它是一个for_loop,否则它是一个command。 -
这是可能的。这有什么帮助,因为在词法分析期间,“for”仍然会被标记为 WORD(因为它首先出现)不?
标签: sequence antlr4 grammar rules