【发布时间】:2020-09-26 04:39:10
【问题描述】:
我是 ANTLR 新手,目前正在为 ANTLR 4 中的酷语言编写词法分析器。 更多酷语言请参考http://theory.stanford.edu/~aiken/software/cool/cool-manual.pdf。
我试图实现的一个很酷的语言规则是检测注释(可能是嵌套的)或字符串常量中的 EOF 并报告为错误。
这是我写的规则:
ERROR : '(*' (COMMENT|~['(*'|'*)'])*? (~['*)']) EOF {reportError("EOF in comment");}
|'"' (~[\n"])* EOF {reportError("EOF in string");};
fragment COMMENT : '(*' (COMMENT|~['(*'|'*)'])*? '*)'
这里的片段 COMMENT 是我使用的递归规则。
上面使用的函数reportError报告错误如下:
public void reportError(String errorString){
setText(errorString);
setType(ERROR);
}
但是当我在下面给出的测试文件上运行它时:
"Test String
它给出以下输出:
line 1:0 token recognition error at: '"Test String\n'
#name "helloworld.cl"
显然没有识别出带有EOF的字符串,也没有检测到错误。
有人可以帮我指出我哪里出错了,因为 EOF(因此,错误规则)在某种程度上没有被词法分析器检测到。
如果有不清楚的地方,请务必提及。
【问题讨论】:
标签: comments antlr4 eof lexer string-constant