バックグラウンド
私は数日間ANTLRWorks(V 1.4.3)を使用していて、単純なブールパーサーを作成しようとしています。以下のレクサー/パーサーの組み合わせ文法は、ブール式のオペランドとして引用符で囲まれた空白のテキストのサポートを含む、ほとんどの要件に適しています。
問題
文法が引用符を必要とせずに空白のオペランドで機能するようにしたいと思います。
例
たとえば、式-
「左右」AND中央
引用符を削除した後でも、同じ解析ツリーを持つ必要があります-
左右中央。
私はバックトラック、述語などについて学んでいますが、解決策を見つけることができないようです。
コード
以下は私がこれまでに得た文法です。愚かな間違いについてのフィードバックは大歓迎です:)。
レクサー/パーサー文法
grammar boolean_expr;
options {
TokenLabelType=CommonToken;
output=AST;
ASTLabelType=CommonTree;
}
@modifier{public}
@ctorModifier{public}
@lexer::namespace{Org.CSharp.Parsers}
@parser::namespace{Org.CSharp.Parsers}
public
evaluator
: expr EOF
;
public
expr
: orexpr
;
public
orexpr
: andexpr (OR^ andexpr)*
;
public
andexpr
: notexpr (AND^ notexpr)*
;
public
notexpr
: (NOT^)? atom
;
public
atom
: word | LPAREN! expr RPAREN!
;
public
word
: QUOTED_TEXT | TEXT
;
/*
* Lexer Rules
*/
LPAREN
: '('
;
RPAREN
: ')'
;
AND
: 'AND'
;
OR
: 'OR'
;
NOT
: 'NOT'
;
WS
: ( ' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}
;
QUOTED_TEXT
: '"' (LETTER | DIGIT | ' ' | ',' | '-')+ '"'
;
TEXT
: (LETTER | DIGIT)+
;
/*
Fragment lexer rules can be used by other lexer rules, but do not return tokens by themselves
*/
fragment DIGIT
: ('0'..'9')
;
fragment LOWER
: ('a'..'z')
;
fragment UPPER
: ('A'..'Z')
;
fragment LETTER
: LOWER | UPPER
;