我想保留用于处理C源文件的空白和换行符,并且我正在使用前面提到的语法here
我将通过删除要跳过的重定向来修改here行表单,如下所示。

Whitespace
    :   [ \t]+
    ;

Newline
    :   (   '\r' '\n'?
        |   '\n'
        )
   ;

但是在任何C程序上执行解析器时,请说:
void main(){
}

它抛出了一个错误
line 1:13 mismatched input '\n' expecting <EOF>

任何帮助解决这个问题的人都将不胜感激。谢谢!

最佳答案

这不起作用如果不跳过空白(或者至少将它们放在不同的通道上),它们将返回到解析器,并且必须在那里进行考虑。因为您只更改了lexer规则,而不是解析器规则,所以没有什么真正可以匹配的。所以

compilationUnit
    :   translationUnit? EOF
    ;

只是被跳过,预计会出现EOF。

10-05 23:05
查看更多