我正在使用Cayenne通过org.apache.cayenne.exp.parser.ExpressionParser解析SQL条件,该条件会生成一系列org.apache.cayenne.exp.parser.Token,并且我想确定每个令牌的类型(例如标识符,等号,数字,字符串等)。

令牌类型肯定由ExpressionParser标识,在我看来,它存储在int字段Token.kind中。该字段在我的解析测试中显示的值绝对是一致的(例如,=始终为5,文字字符串始终为42and运算符始终为2等)。

我的问题是,我找不到包含与Token.kind值进行比较的常量的Java类。

字段Token.kind的Javadoc说:


一个整数,描述此令牌的种类。这个编号
系统由JavaCCParser确定,这些数字的表为
存储在文件... Constants.java中。


它没有指定文件的全名,所以我下载了JavaCCParser,并检查了在*Constants.*javacc-5.0src.zip,这两个zip中包含的两个javacc-6.0.zipjavacc.jar中找到的几个cayenne-3.0.2-src.tar.gz文件。

在我看来,没有一个类似乎具有与我在测试中看到的值一致的常量。
我最接近的是org.apache.cayenne.exp.parser.ExpressionParserConstants类,例如。包含int PROPERTY_PATH = 34int SINGLE_QUOTED_STRING = 42,它们确实与我的测试表达式的实际标记匹配,但例如,其他标记在该类中没有相应的常量。 =符号(kind = 5)和and运算符(kind = 2)。

所以我的问题是,是否有人知道在哪个Java类中定义了这些常量。

最佳答案

首先,我应该提到ExpressionParser是为解析Cayenne表达式的特定格式而设计的。它当然不能用于解析SQL。因此,您可能会朝错误的方向看。

解析器本身由JavaCC基于此grammar file生成。解析器的令牌在此文件的底部正式定义,并且非常针对手头的任务。

10-07 23:37