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代码,在你的情况下。您不能简单地将 in 更改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 回答