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

时间:2012-05-27 07:25:15

标签: c++ translation antlr

我使用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 default指令在C#语言中执行此操作: http://msdn.microsoft.com/en-us/library/34dk387t.aspx  但是找不到与C ++类似的东西

1 个答案:

答案 0 :(得分:1)

问题尚不清楚,但是您自己#linesource-line生成了source-file指令?对不起,我不熟悉Antlr。

事实上,#line __LINE__ __FILE__除了将__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