我正在尝试像这样在 antlr 中做评论:
HASH : '#' ;
COMMENT : HASH ~[\r\n] -> skip ;
现在考虑(简化的)语法:
start : body EOF? ;
w : (NL | s)+ ;
s : S+ ;
body : (w? expression w? NL+)* w? (varl=WORD | expression) w? ;
expression : WORD ;
WORD 是 [a-zA-Z],NL 是 ' ' 而 S 是 ' '。我解析空格和空格的原因是因为我需要语言的语义(例如,表达式总是以换行符结尾)。
当我有一个仅解析文件然后打印出解析代码的简单程序时,我似乎得到了错误的结果(至少不是我期望和想要的)。
以下节目:
# test
x
#test
y
将打印为
x
y
但是这个程序:
x # test
y
会打印出来
x
但我希望它成为
x
y
我的猜测是 y 以某种方式包含在 COMMENT 令牌中,我对此表示怀疑,或者 skip 并不像我认为的那样。据我了解,skip 只会从令牌流中完全删除令牌,那么为什么我的程序被错误地解析了?
附注 我用来解析和打印上面的小测试程序的(java)程序看起来像(伪代码):
println(解析("test.txt").getText)
where parse会返回“test.txt”内容对应的antlr解析树。 请注意,我也没有在控制台中打印任何解析器错误。
提前致谢!