0

Cayenne を使用してorg.apache.cayenne.exp.parser.ExpressionParser、一連の を生成する を介して SQL 条件を解析していますorg.apache.cayenne.exp.parser.Token。各トークンのタイプ (識別子、等号、数値、文字列など) を特定したいと考えています。

トークンの型は ExpressionParser によって確実に識別され、intfieldに格納されているように思えますToken.kind。私の解析テストでこのフィールドが示す値は、確実に一貫しています (たとえば、 =is always 5、リテラル文字列は always 42and演算子は always2など)。

Token.kind私の問題は、値を比較する定数を含む Java クラスが見つからないことです。

フィールドの Javadocは次のようにToken.kind述べています。

このトークンの種類を表す整数。この番号付けシステムは JavaCCParser によって決定され、これらの番号のテーブルがファイル ...Constants.java に格納されます。

ファイルの完全な名前が指定されていないため、JavaCCParser をダウンロード*Constants.*してjavacc-5.0src.zipjavacc-6.0.zip、 、javacc.jarそれら 2 つの zip に含まれる 2 つ、およびcayenne-3.0.2-src.tar.gz.

そこで見つけたクラスのどれも、テストで見た値と一貫して一致する定数を持っているようには見えません。私がそれに到達することができた最も近いものは、クラスorg.apache.cayenne.exp.parser.ExpressionParserConstantswhich for ex. を含みint PROPERTY_PATH = 34int SINGLE_QUOTED_STRING = 42これはテスト式の実際のトークンと完全に一致しますが、他のトークンにはそのクラスに対応する定数がありません。=記号 ( kind= 5) と演算子and( kind= 2)。

だから私の質問は、どのJavaクラスでそれらの定数が定義されているかを誰かが知っているかどうかです。

4

1 に答える 1

1

まず、ExpressionParser は非常に特殊な形式の Cayenne 式を解析するように設計されていることを述べておく必要があります。もちろん、SQL の解析には使用できません。そのため、間違った方向を見ている可能性があります。

パーサー自体は、この文法ファイルに基づいて JavaCC によって生成されます。パーサーのトークンは、このファイルの下部で正式に定義されており、当面のタスクに非常に固有です。

于 2013-11-05T12:55:09.107 に答える