背景
几天来,我一直在使用 ANTLRWorks (V 1.4.3) 并尝试编写一个简单的布尔解析器。下面的组合词法分析器/解析器语法适用于大多数要求,包括支持带引号的空白文本作为布尔表达式的操作数。
问题
我希望语法适用于空白操作数而不需要引号。
例子
例如,表达式-
“左右”和中心
即使删除引号后也应该具有相同的解析树-
左右和中心。
我一直在学习回溯、谓词等,但似乎找不到解决方案。
代码
以下是我到目前为止所掌握的语法。感谢您对愚蠢错误的任何反馈:)。
词法分析器/解析器语法
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
;