gpt4 book ai didi

c - 什么是 Antlr3 C 运行时等效于抛出错误报告的异常

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:30 25 4
gpt4 key购买 nike

我非常熟悉 Antlr 2.X 和 Antlr 3.1.X CSharp 和 python 目标。

但是,我现在不得不为一个项目使用 Antlr 3 C 目标。

我的问题是如何报告我的语法或树语法中的错误。

考虑一个与标记匹配的规则,我们将其放入映射中。我们要确保 token 是唯一的。通常,如果标记已经在映射中,我会抛出异常并在 hte 解析器之外捕获异常以报告错误。

以下规则的 Antlr C 运行时等效项是什么?

token_match: ID 
{
if(mp.find($ID.Text))
throw std::exception("Non unique token found");
}

最佳答案

我建议使用您自己的方法来显示语义错误。但是如果你需要为此留在 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";

接下来,您需要在检测到错误时实际抛出异常。我认为执行此操作的唯一方法是覆盖添加到您的代码中的 mismatch() 并从您的规则中调用它。

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;
}

关于c - 什么是 Antlr3 C 运行时等效于抛出错误报告的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com