1

C# アプリケーションでかなり単純な Oracle SQL クエリを解析して実行しようとしています。このために、パーサー ツールとして ANTLR を使用することにしました。これは、Oracle SQL 言語の文法が既に文法リスト ページからダウンロードできるためです。

また、ANTLR 3.4 の最新バージョンを入手し、次のコマンドを使用して、アプリケーションで使用する C# ソース ファイルを生成しました。

java -cp antlr-3.4-complete.jar org.antlr.Tool OracleSQL.g

ちょっとした注意: 元の文法ファイルの出力言語は C だったので、変更しましたCSharp2( も試しましCSharp3たが、うまくいきませんでした)。

コードの問題は、このようなコードのブロックを取得することです

if ((((( !(strcasecmp((const char*)LT(1)->getText(LT(1))->chars, "SUBPARTITION")) )&&

したがって、ソリューションはコンパイルされません。

ここに投稿されたソリューションも試しましたが、役に立ちませんでした。

私は何が欠けていますか?

ありがとう、エイドリアン。

4

1 に答える 1

3

多くの場合、ANTLR 文法には埋め込み (ターゲット) コードが含まれています。あなたの場合、Cコード。language=C;単純に(または別の言語に)変更することはできませんlanguage=CSharp2。ANTLR は、C コードが埋め込まれた C# でレクサーおよび/またはパーサーを生成するだけです。埋め込まれたすべての C コードを自分で書き直す必要があります。

たとえば、次の C を対象とした文法は次のとおりです。

grammar T;

options {
  language=C;
}

parse
 : Any* EOF {printf("done!\n");}
 ;

Any
 : .
 ;

次のように (C# の場合) 書き直す必要があります。

grammar T;

options {
  language=CSharp2; // or CSharp3
}

parse
 : Any* EOF {Console.WriteLine("done!");}
 ;

Any
 : .
 ;
于 2012-05-21T17:25:15.550 に答える