5

カスタム言語を C++ コードに変換するために antlr を使用しています。この言語では、ユーザーは$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++ に似たものを見つけることができませんでした

4

1 に答える 1

1

質問からは明らかではありませんが、あなたは自分で与えられたディレクティブを生成しています#lineか?申し訳ありませんが、私はAntlrに精通していません。source-linesource-file

実際、マクロをそれ自体#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
于 2012-05-27T08:52:41.347 に答える