我正在使用Cayenne通过org.apache.cayenne.exp.parser.ExpressionParser
解析SQL条件,该条件会生成一系列org.apache.cayenne.exp.parser.Token
,并且我想确定每个令牌的类型(例如标识符,等号,数字,字符串等)。
令牌类型肯定由ExpressionParser标识,在我看来,它存储在int
字段Token.kind
中。该字段在我的解析测试中显示的值绝对是一致的(例如,=
始终为5
,文字字符串始终为42
,and
运算符始终为2
等)。
我的问题是,我找不到包含与Token.kind
值进行比较的常量的Java类。
字段Token.kind
的Javadoc说:
一个整数,描述此令牌的种类。这个编号
系统由JavaCCParser确定,这些数字的表为
存储在文件... Constants.java中。
它没有指定文件的全名,所以我下载了JavaCCParser,并检查了在*Constants.*
,javacc-5.0src.zip
,这两个zip中包含的两个javacc-6.0.zip
和javacc.jar
中找到的几个cayenne-3.0.2-src.tar.gz
文件。
在我看来,没有一个类似乎具有与我在测试中看到的值一致的常量。
我最接近的是org.apache.cayenne.exp.parser.ExpressionParserConstants
类,例如。包含int PROPERTY_PATH = 34
和int SINGLE_QUOTED_STRING = 42
,它们确实与我的测试表达式的实际标记匹配,但例如,其他标记在该类中没有相应的常量。 =
符号(kind
= 5)和and
运算符(kind
= 2)。
所以我的问题是,是否有人知道在哪个Java类中定义了这些常量。
最佳答案
首先,我应该提到ExpressionParser是为解析Cayenne表达式的特定格式而设计的。它当然不能用于解析SQL。因此,您可能会朝错误的方向看。
解析器本身由JavaCC基于此grammar file生成。解析器的令牌在此文件的底部正式定义,并且非常针对手头的任务。