使用antlr和line指令插入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#语言中执行此操作: 解决方法
从问题中不清楚,但是你自己生成了#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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |