2

相同的 oracle SQL 语法使用 Antlr-3.3-complete.jar 生成且没有错误,并使用 Netbeans/GCC 或 Visual Studio 成功编译。

使用 Antlr-3.5-complete.jar 生成语法会生成 23500 行警告消息,描述模板错误,包括数百个异常。

代码是使用以下命令行生成的:

java -d64 -Xmn2000M -Xmx8000M -jar antlr-3.5-complete.jar OracleSQL_v2.g 

antlr-3.5-complete.jar 于 2013 年 3 月 22 日从 antlr.org 网站下载。

该语法基于 Ivan.Brezina 发布的 antlr.org 站点中的 Oracle PL/SQL 语法。

生成的代码有 282 个未声明的标识符。许多$tokenRef变量在生成的解析器 synpred 子例程中未声明。此外,生成的词法分析器有 100 个案例

error C2065: '_empty' : undeclared identifier

这是模板错误的子集:

warning(24):  template error: context [/outputFile /parser] 1:1 could not pass through undefined attribute filterMode

600+ duplicate errors:
warning(24):  template error: context [/outputFile /parser /genericParser /_sub45 /ruleAttributeScopeFuncMacro] 1:4 no such property or can't access: null.attributes

warning(24):  template error: context [/outputFile /parser /genericParser] 155:5 no such property or can't access: null.apifuncs

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleInitializations /ruleInitializations] 4:1 no such property or can't access: null.attributes

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /matchSet /matchSet /_sub127 /createNodeFromToken] 1:4 no such property or can't access: null.node

20 duplicate errors:
warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleInitializations /ruleInitializations] 4:1 no such property or can't access: null.attributes

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /block /_sub86 /altSwitchCase /alt /element /blockSingleAlt /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteImaginaryTokenRefRoot /createImaginaryNode] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /block /_sub86 /altSwitchCase /alt /element /blockSingleAlt /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteOptionalBlock /rewriteElementList /rewriteElement /rewriteTokenRef /createRewriteNodeFromElement] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /block /_sub86 /altSwitchCase /alt /element /blockSingleAlt /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteTree /rewriteElement /rewriteImaginaryTokenRefRoot /createImaginaryNode] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /block /_sub86 /altSwitchCase /alt /element /blockSingleAlt /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteTree /rewriteElement /rewriteTokenRef /createRewriteNodeFromElement] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /element /block /_sub86 /altSwitchCase /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteImaginaryTokenRefRoot /createImaginaryNode] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleInitializations /ruleInitializations] 4:1 no such property or can't access: null.attributes

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleBlockSingleAlt /alt /rewriteCode /rewriteAlt /rewriteElementList /rewriteElement /rewriteTree /rewriteElement /rewriteImaginaryTokenRefRoot /createImaginaryNode] 1:4 no such property or can't access: null.node

warning(24):  template error: context [/outputFile /parser /genericParser /rule /ruleInitializations /ruleInitializations] 4:1 no such property or can't access: null.attributes



200+ duplicate exceptions:

Caused by: org.stringtemplate.v4.misc.STNoSuchPropertyException: no such property: java.lang.String.referencedRule
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.throwNoSuchProperty(ObjectModelAdaptor.java:106)
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.lookupMethod(ObjectModelAdaptor.java:99)
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.getProperty(ObjectModelAdaptor.java:67)
    at org.stringtemplate.v4.Interpreter.getObjectProperty(Interpreter.java:1158)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:210)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:703)
    at org.stringtemplate.v4.Interpreter.writeIterator(Interpreter.java:733)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:708)
    at org.stringtemplate.v4.Interpreter.writeObjectWithOptions(Interpreter.java:665)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:292)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:703)
    at org.stringtemplate.v4.Interpreter.writeObjectNoOptions(Interpreter.java:635)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:285)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:703)
    at org.stringtemplate.v4.Interpreter.writeIterator(Interpreter.java:733)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:708)
    at org.stringtemplate.v4.Interpreter.writeObjectWithOptions(Interpreter.java:665)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:292)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:703)
    at org.stringtemplate.v4.Interpreter.writeObjectNoOptions(Interpreter.java:635)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:285)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.Interpreter.writeObject(Interpreter.java:703)
    at org.stringtemplate.v4.Interpreter.writeObjectNoOptions(Interpreter.java:635)
    at org.stringtemplate.v4.Interpreter._exec(Interpreter.java:285)
    at org.stringtemplate.v4.Interpreter.exec(Interpreter.java:145)
    at org.stringtemplate.v4.ST.write(ST.java:415)
    at org.antlr.codegen.CodeGenerator.write(CodeGenerator.java:1296)
    at org.antlr.codegen.CTarget.genRecognizerFile(CTarget.java:54)
    at org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:459)
    at org.antlr.Tool.generateRecognizer(Tool.java:696)
    at org.antlr.Tool.process(Tool.java:509)
    at org.antlr.Tool.main(Tool.java:98)
Caused by: java.lang.NoSuchFieldException: referencedRule
    at java.lang.Class.getField(Class.java:1537)
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.lookupMethod(ObjectModelAdaptor.java:88)
    ... 35 more

1800+ duplicate errors for [headerReturnScope, ruleAttributeScopeDecl, and ruleDeclarations]:
warning(24):  template error: context [/headerFile /_sub143 /ruleAttributeScopeDecl] 1:4 no such property or can't access: null.attributes
4

3 回答 3

2

由于 3.5 之前的版本中存在错误,这些消息被无意中隐藏了。一些目标已更新以纠正问题,但您使用的目标似乎尚未更新(您未指定)。

另请注意,有关模板错误的消息是警告消息,而不是错误。您的输出仍应生成。

你能发布一个小例子来重现编译器错误吗?

于 2013-03-22T20:00:49.783 回答
0

我遇到了关于“未声明的_empty”的同样问题。我发现的最简单的例子是:

foo: ( 'A'+ 'B' )+ 'A'+ ;

(这个错误案例似乎与“循环 DFA”模式有关。但我不明白它的真正含义。)

ANTLR 3.5.1 生成解析器源,如:

static const ANTLR3_INT32 * const dfa2_transitions[] =
{
    dfa2_T1, dfa2_T0, _empty, _empty
};

这会导致针对未声明的“_empty”的编译错误。

在这部分之前,我发现:

/** Used when there is no transition table entry for a particular state */
#define dfa2_T_empty        NULL

我猜“_empty”在生成的代码中应该是“dfa2_T_empty”。

我目前在我的语法文件中放置了快速解决方法。但我不确定这在运行时是否能正常工作。

@header {
   #define _empty NULL
}
于 2014-01-10T09:30:56.077 回答
0

我有同样的错误。语法取自http://www.antlr3.org/grammar/list.html

重现错误所需的只是下载,提供 antlr-3.4-complete.jar(修改 Makefile)而不是附加的 antlr-3.3-complete.jar 并运行 Makefile。

处理语法过程中出现很多警告错误。生成的输出源文件,但无法编译,因为 ANTLR 3.4 和 3.5 生成如下行:

void ;
#undef RETURN_TYPE
#define RETURN_TYPE void

打字

grep undef.*RETURN_TYPE OracleSQLParser.c | 荷兰语
显示使用模板 C.stg 正确填充了前 1135 个案例。从 1136 到生成源结束,所有事件都被 void 填充。

当我将输出从 C 目标切换到 java 时,没有看到任何错误。

于 2013-03-25T06:45:09.853 回答