我已经使用ANTLRWorks(V 1.4.3)几天了,并尝试编写一个简单的布尔解析器。下面的组合词法分析器/解析器语法适用于大多数要求,包括支持引用的白色间隔文本作为布尔表达式的操作数。
我希望语法适用于白色间隔的操作数而不需要引号。
例如,表达式 -
删除引号后,“左右”和中心
应该具有相同的分析树 -
左右和中心。
我一直在学习回溯,谓词等,但似乎无法找到解决方案。
以下是我到目前为止的语法。任何关于愚蠢错误的反馈都值得赞赏:)。
Lexer / Parser Grammar
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
;
答案 0 :(得分:1)
只需让TEXT
规则中的atom
匹配一次或多次:TEXT+
。如果它不止一次匹配TEXT
令牌,您还需要为这些TEXT
令牌创建自定义根节点(我在下面的语法中添加了一个名为WORD
的虚构令牌)
grammar boolean_expr;
options {
output=AST;
}
tokens {
WORD;
}
evaluator
: expr EOF
;
...
word
: QUOTED_TEXT
| TEXT+ -> ^(WORD TEXT+)
;
...
您的输入"left right AND center"
现在将按以下方式解析: