繁体   English   中英

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

[英]C++ Code insertion using antlr and the line directive

我使用antlr将自定义语言翻译为C ++代码。 在这种语言中,用户可以在$code...$endcode指令之间嵌入C ++代码片段, $code...$endcode插入到翻译的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 default指令在C#语言中执行此操作: http//msdn.microsoft.com/en-us/library/34dk387t.aspx但是找不到任何内容类似于C ++

从问题中不清楚,但是你自己生成了#line指令给出了source-linesource-file 对不起,我对Antlr并不熟悉。

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

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

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

$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM