我想保留用于处理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。