加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用antlr和line指令插入C代码

发布时间:2020-12-16 07:00:07 所属栏目:百科 来源:网络整理
导读:我使用antlr将自定义语言翻译为C代码. 在这种语言中,用户可以在$code … $endcode指令之间嵌入C代码片段,它将按原样插入到已翻译的C代码中. 我有以下问题:当代码片段中出现错误时,我希望编译器指向源文件而不是翻译的C代码. 我尝试使用如下的行指令,但它不
我使用antlr将自定义语言翻译为C代码.
在这种语言中,用户可以在$code … $endcode指令之间嵌入C代码片段,它将按原样插入到已翻译的C代码中.

我有以下问题:当代码片段中出现错误时,我希望编译器指向源文件而不是翻译的C代码.

我尝试使用如下的行指令,但它不起作用:

"foo.custom_laguage"
1 $code
2 ...some c++ code...
3 $endcode

被翻译成

"auto-generated.cpp"
42 #line 2 "foo.custom_language"
43 ...some c++ code...
44 #line __LINE__ __FILE__

这不起作用,我认为因为#line指令稍后会修改__LINE__宏写入的内容.如何将行号设置回已翻译的C代码中的实际行号? antlr是怎么做到的?

这是我希望自动生成的代码看起来像:

"auto-generated.cpp"
42 #line 2 "foo.custom_language"
43 ...some c++ code...
44 #line 44 "auto-generated.cpp"  //actual line in this file
45 ..some more C++ code ...

编辑:我刚刚发现有一种方法可以使用#line默认指令在C#语言中执行此操作:
http://msdn.microsoft.com/en-us/library/34dk387t.aspx
?但是找不到任何与C类似的东西

解决方法

从问题中不清楚,但是你自己生成了#line指令给出了源代码行和源代码文件?对不起,我对Antlr并不熟悉.

实际上,#line __LINE__ __FILE__除了将__LINE__宏指定给自己之外什么都不做.

由于预处理器的评估语义,您无法轻松地将__LINE__的数值赋给宏. (您只能定义一个新的宏来按字面意图映射到宏__LINE__,返回其当前值.)但为什么需要它呢?除非Antlr本身使用__LINE__宏,否则您无需将其恢复为以前的值.

如果这是一个问题,最直接的解决方案是将原始C代码放在单独的包含文件中并放弃内联嵌入.为了防止头文件的扩散,您可以使用类似的结构

$code
#define USE_SNIPPET_FOO
#include "snippets.h"
$endcode

$code
#define USE_SNIPPET_BAR
#include "snippets.h"
$endcode

在标题中,有一种反向标题:

#ifdef USE_SNIPPET_FOO
#undef USE_SNIPPET_FOO
class foo {};

#elif defined USE_SNIPPET_BAR
#undef USE_SNIPPET_BAR
class bar {};

#else
#error no snippet selected
#endif

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读