Java 解析API函数中的冗余代码?
在研究一些解析API时,我遇到了一种用于编写解析函数的常用技术:Java 解析API函数中的冗余代码?,java,parsing,lucene,javacc,Java,Parsing,Lucene,Javacc,在研究一些解析API时,我遇到了一种用于编写解析函数的常用技术: final public Query parse() throws ParseException { Query q; // some parsing code using tokens here {if (true) return q;} throw new Error("Missing return statement in function"); } 我注意到许多解析器类都在使用相同的语法 (即org.a
final public Query parse() throws ParseException {
Query q;
// some parsing code using tokens here
{if (true) return q;}
throw new Error("Missing return statement in function");
}
我注意到许多解析器类都在使用相同的语法
(即org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser#TopLevelQuery&
)
这让我很困惑,因为我不能得出一个具体的结论,为什么这段代码是这样写的
除了强调它必须总是返回一些东西之外,还有什么隐藏的东西吗
提前感谢,自动生成的代码通常是正确的,但看起来很不优雅。要生成正确的代码而不担心优雅是很困难的
似是而非的猜测:{存在是因为在那一点上,生成器不知道它是否需要它;它很快就会学习,但“很快”不是“现在”。之所以出现这种情况,是因为此时生成器不确定它是否已为100%的输入生成了返回语句。该类已自动生成。源代码:
/*生成者:JavaCC:不要编辑这一行。JsonParser.java*/
。我无法告诉您为什么JavaCC的作者选择生成无用的条件hough.也许你可以在生成之前插入额外的返回条件?我还想知道,如果没有返回
,为什么他们选择抛出错误
,而不是让类留下编译错误。我猜这是从Javascript代码生成的,其中返回语句是可选的。翻译进入Java可能需要这种方法,但不知道为什么。首先,代码不是按通常意义编写的,它是按照其他人提到的那样生成的。throw
命令在那里,因为没有它,代码将无法编译。至少Eclipse编译器会出现致命错误。(尝试删除该行,看看会发生什么。)真正的问题是为什么if(true)
会出现,对此我没有答案。顺便说一句,这与强调无关,因为你真的不应该阅读这个文件,除非有错误需要修复。它与JavaScript无关;JavaCC的输入是一个JavaCC语法文件。