antlr3を使用して簡単な条件式パーサーを作成したい
更新:AND / ORの異なる階層をサポートするために、AND OR式のルールを分離しましたが、別の問題が発生しました: 式が次のようなものである場合:a=1およびb=2およびc=3ツリーは、現在の実装に従って次のようになります。
= =
(a = 1)(b = 2)(c = 3)
But I want to generate it as follows:
= =
(a = 1)(b = 2)
(c = 3)
First "and" should be higher priority than another, because I want to parse all the expression as left exp and right exp.
「サブコンド」のルールを書き直す必要があると思います。a =1およびb=2およびc=3->(a=1およびb=2)およびc=3にする
しかし、運が悪かったので何度も試しました。誰かがそれを達成する方法を知っていますか?ありがとう。
私の目標は、ある種のSQL where句スタイルの文を解析し、ウォークスルーするASTを構築することです。
例えば:
a = 1 and (b = 2 or c = 3) //This one can parse correctly.
a = 1 and ((b = 2 or c = 3) or d = 4) //This one cannot parse correctly, missing last d = 4 in the tree.
//Tree is not correct.
私の現在の文法ファイルは、上記の複雑な条件を解析できません。私はantlrの初心者なので、上記のアプローチをより正確に達成するために文法を変更する方法がわかりません。誰かがこれを手伝ってくれる?!提案やコメントは大歓迎です。
と私の文法は次のとおりです(コメントに従って更新されました。警告の問題は解決されました。):
grammar CriteriaExpression;
options {
output = AST;
ASTLabelType = CommonTree;
language = Java;
}
tokens {
AND = 'and';
OR = 'or';
LPAREN = '(';
RPAREN = ')';
}
@lexer::header {
package com.antlr;
}
@parser::header {
package com.antlr;
}
eval
:
expression
;
式:andExp(OR ^ andExp)*;
andExp:subcond(AND ^ subcond)*;
subcond:LPAREN式RPAREN | atom;
atom
:
EXPR OPERATOR EXPR
;
OPERATOR
:
'='| '<>'| '!='| '<='| '!>'| '<'| '>='| '!<'| '>'| 'like'
;
EXPR
:
('a'..'z'| 'A'..'Z'| '0'..'9')+
;
WILDCARD
:
'%'
;
WS
:
('\t'| ' '| '\r'| '\n'| '\u000C')*
{$channel = HIDDEN;}
;
((a = 1))
a = 1および((b=2またはc=3)またはd = 4)