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
これは行く方法ですか?ここで基本的な機能が欠けているような気がします。