如何在 Antlr 中正确处理评论?

问题描述 投票:0回答:0

我正在尝试像这样在 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解析树。 请注意,我也没有在控制台中打印任何解析器错误。

提前致谢!

parsing comments antlr antlr4 grammar
© www.soinside.com 2019 - 2024. All rights reserved.