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

标签 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 ...

编辑:我刚刚发现在 C# 语言中有一种方法可以通过使用 #line default 指令来执行此操作: http://msdn.microsoft.com/en-us/library/34dk387t.aspx 但是找不到 C++ 的类似内容

最佳答案

问题并不清楚,但是您是在给定 source-linesource-file 的情况下自己生成 #line 指令吗?抱歉,我对 Antlr 不熟悉。

事实上,#line __LINE__ __FILE__ 只是将 __LINE__ 宏分配给它自己。

由于预处理器的求值语义,您无法轻松地将 __LINE__ 的数值分配给宏。 (您只能定义一个新的宏来按字面意思映射到宏 __LINE__,返回它的 current 值。)但是为什么需要那个?除非 Antlr 本身使用了 __LINE__ 宏,否则您不需要将其恢复为之前的值。

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

这样的结构
$code
#define USE_SNIPPET_FOO
#include "snippets.h"
$endcode

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

在 header 中,一种反向 header 防护:

#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

关于使用 antlr 和 line 指令的 C++ 代码插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10772342/

相关文章:

c++ - 具有 'this' 指针的类的大小

c++ - IStorage::OpenStorage OLECHAR *pwcsName for MS Project 2010

c++ - Qt QStateMachine 同步问题 : Initial State not set on Started Signal

php - 构建网站翻译文件

parsing - ANTLR vs. Happy vs. 其他解析器生成器

c++ - python distutils 不包括 SWIG 生成的模块

ios - 添加新语言进行本地化/翻译时 Xcode 崩溃

从驻点到任意点的 3D 三角变换

javascript - antlr 生成词法分析器但不生成解析器

java - ANTLR 提供这些功能吗?