我正在尝试在C#应用程序中解析并执行一个相当简单的Oracle SQL查询。为此,我决定使用ANTLR作为解析器工具,因为Oracle SQL语言的语法已经可以从grammar list page下载。
我还选择了最新版本的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")) )&&
因此解决方案无法编译。
我也尝试过发布here的解决方案,但无济于事。
我错过了什么?
谢谢, 阿德里安。
答案 0 :(得分: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
: .
;