3

ANTLRで実装された単純なクエリパーサーを作成していますが、クエリのツリー表現を取得したいと思います。このために、私はを使用してoptions { output = AST }います。次に、クエリを解析してツリーを取得します(コードはpythonです)。

lexer = MyQueryLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = MyQueryParser(tokens)
q = parser.query()  # query is my root rule
# do something with q.tree

これで、パーサーから取得したツリーにはルール名が含まれず、フラットリストのトークンのみが含まれます。書き換えルールを使用し^たり!、ツリー構造に組み込んだりすることはできますが、それでもトークンにすぎません。たとえば、クエリの1つの一部がである可能性がありますcolor = 1。これは、次のルールに一致します(簡略化)。

propcondition
: propertyname '=' value

それは次のようになります。

# token type, text
5 color
20 =
8 1

'='^私はそれを次のように変えることができます:

20 =
  5 color
  8 1

しかし、私はそのフラグメントが「適切な条件」として一致したことを覚えておいてほしい。私が見つけた最も近いものは、書き換えルールを使用して偽のトークンを導入することでした。

propcondition
: propertyname '=' value -> ^(PROPCONDITION propertyname '=' value)
// ...

次に、次のようになります。

4 PROPCONDITION
  5 color
  20 =
  8 1

これは行く方法ですか?ここで基本的な機能が欠けているような気がします。

4

1 に答える 1

1

はい、それが行く方法です。PROPCONDITIONという名前のルートを作成する場合、記号を削除できることに注意してください'='。このような条件には、常に 2 つの子が含まれますよね? 左側と右側。

propcondition
 : propertyname '=' value -> ^(PROPCONDITION propertyname value)
 ;

次のツリーを作成します。

ここに画像の説明を入力

さらに演算子がある場合は、次のことができます。

propcondition
 : propertyname '=' value -> ^(PROPCONDITION ^('=' propertyname value))
 | propertyname '<' value -> ^(PROPCONDITION ^('<' propertyname value))
 | ...
 ;
于 2012-06-22T12:31:37.793 に答える