我非常熟悉Antlr 2.X和Antlr 3.1.X CSharp和python目标。
但是我现在被迫使用Antlr 3 C目标进行项目。
我的问题是如何在语法或树语法中报告错误。
考虑匹配令牌的规则,然后将其放入地图中。我们希望确保令牌是唯一的。通常,如果令牌已经在地图中并且在hte解析器之外捕获异常以报告错误,我会抛出异常。
什么是Antlr C运行时等效于以下规则?
token_match: ID
{
if(mp.find($ID.Text))
throw std::exception("Non unique token found");
}
答案 0 :(得分:1)
我建议使用您自己的方法来显示语义错误。但是如果你需要留在ANTLR:
如果要创建自定义异常类型,首先必须创建自己的错误处理程序。查看antlr3baserecognizer.c:1000作为原始文件。
static void
displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames)
{
...
switch (ex->type)
{
case ANTLR3_UNWANTED_TOKEN_EXCEPTION:
...
case NUTF_EXCEPTION:
printf("Non unique token found");
break;
然后编写一些函数或规则代码来处理异常结构。查看antlr3baserecognizer.c:325来设置您的例外。
ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION,
(void *)ANTLR3_RECOGNITION_EX_NAME,
NULL,
ANTLR3_FALSE);
ex->type = NUTF_EXCEPTION
ex->line = ins->getLine (ins);
ex->charPositionInLine = ins->getCharPositionInLine (ins);
ex->index = is->index (is);
ex->streamName = ins->fileName;
ex->message = "That was totally unexpected";
接下来,您需要在检测到错误时实际抛出异常。我认为唯一的方法是覆盖不匹配()添加代码并从规则中调用它。
static void
mismatchNew(pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow)
{
...
}
最后告诉ANTLR使用你的新功能。
@parser::apifuncs {
RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
RECOGNIZER->antlr3RecognitionExceptionNew = antlr3RecognitionExceptionNewNew;
RECOGNIZER->mismatch = mismatchNew;
}