我真正的语法更复杂,但我可以解决我的问题。所以这就是语法:
grammar test2;
options {language=CSharp3;}
@parser::namespace { Test.Parser }
@lexer::namespace { Test.Parser }
start : 'VERSION' INT INT project;
project : START 'project' NAME TEXT END 'project';
START: '/begin';
END: '/end';
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
INT : '0'..'9'+;
NAME: ('a'..'z' | 'A'..'Z')+;
TEXT : '"' ( '\\' (.) |'"''"' |~( '\\' | '"' | '\n' | '\r' ) )* '"';
STARTA
: '/begin hello';
我想解析这个(例如):
版本1 1
/开始项目
testproject“描述在这里”
/结束
项目
现在它不会像这样工作(不匹配的令牌异常)。如果我删除最后一个令牌STARTA,它的工作原理。但为什么?我不明白。
非常感谢帮助。 感谢。
答案 0 :(得分:2)
当词法分析器看到输入"/begin "
(包括空格!)时,它将被提交到规则STARTA
。当它无法匹配所述规则时,因为输入中的下一个字符是"p"
(来自"project"
)而不是"h"
(来自"hello"
),它将尝试匹配另一个可以匹配"/begin "
的规则(包括空格!)。但是没有这样的规则,产生错误:
mismatched character 'p' expecting 'h'
并且词法分析器将不放弃空格并匹配START
规则。
请记住最后一部分:一旦词法分析器匹配某些东西,它就不会放弃它。它可能会尝试匹配相同输入的其他规则,但它不会回溯以匹配匹配较少字符的规则!
这就是词法分析器在ANTLR 3.x中的工作方式,而不是它。