3

うまくいけば、これは本当に簡単なものです ;) 私は ANTLR3 でレクサー / パーサーの仕様を書き、CSharp2 ターゲットをターゲットにしています。生成されたコードは正しく動作しますが、ANTLR で C# 出力を名前空間に入れることができません。

文法ファイルの関連セクションは次のとおりです。

grammar MyGrammar;

options
{
    language = CSharp2;
    output = AST;
    ASTLabelType = CommonTree;
}

正しい名前空間を生成するために、私は試しました:

@namespace { MyNamespace }

@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }

しかし、これらはどちらもエラーを生成し、ファイルにルールがないと主張します。

どんな助けでも大歓迎です。

4

3 に答える 3

5

これをレクサーとパーサーを組み合わせて使用​​します (名前空間を正しく生成します)。

grammar Test;

options
{
    language=CSharp2;
}

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}


DIGIT   :   '0'..'9';

simple  :    DIGIT EOF;

では、なぜあなたのバージョンが機能しなかったのだろうかと思います。おそらく、この簡単な例を試して、機能するかどうかを確認してください。

于 2008-11-25T09:54:45.483 に答える
4

tokens{} ブロックの後に @namespace ディレクティブを配置する必要があるようです。今は大丈夫...

于 2008-11-26T02:14:56.537 に答える
2

(および CSharp2 も) を使用language = 'CSharp3';すると、次のことができます。

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}

これは以下を生成します:

} // namespace 
 My.Name.Space <-- compile error here

lexer および parser コードの最後。私が書く場合:

@lexer::namespace {My.Name.Space}

@parser::namespace {My.Name.Space}

それは正常に動作し、以下を生成します:

} // namespace My.Name.Space <-- within the line comment, no error of course
于 2012-09-18T13:27:06.837 に答える