[英]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-line
和source-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.