Parsing 支持布尔表达式中的可选引号 背景
我已经使用ANTLRWorks(V1.4.3)几天了,并试图编写一个简单的布尔解析器。下面的组合lexer/parser语法适用于大多数需求,包括支持将带引号的白间隔文本作为布尔表达式的操作数Parsing 支持布尔表达式中的可选引号 背景,parsing,antlr,antlrworks,Parsing,Antlr,Antlrworks,我已经使用ANTLRWorks(V1.4.3)几天了,并试图编写一个简单的布尔解析器。下面的组合lexer/parser语法适用于大多数需求,包括支持将带引号的白间隔文本作为布尔表达式的操作数 问题 我希望语法适用于不需要引号的白间隔操作数 例子 例如,表达式- “左-右”和中间 即使在删除引号后,也应具有相同的分析树- 左右和中间 我一直在学习回溯、谓词等,但似乎找不到解决方案 代码 下面是到目前为止我掌握的语法。任何关于愚蠢错误的反馈都将不胜感激:) 词法分析器/语法分析器 gramm
问题 我希望语法适用于不需要引号的白间隔操作数
例子 例如,表达式- “左-右”和中间 即使在删除引号后,也应具有相同的分析树- 左右和中间 我一直在学习回溯、谓词等,但似乎找不到解决方案
代码 下面是到目前为止我掌握的语法。任何关于愚蠢错误的反馈都将不胜感激:) 词法分析器/语法分析器
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
;
只需让
TEXT
在atom
规则中匹配一次或多次:TEXT+
。当它多次匹配TEXT
标记时,您还需要为这些TEXT
标记创建一个自定义根节点(我在下面的语法中添加了一个名为WORD
的虚构标记)
您的输入“左-右-中”
现在将被解析如下:
grammar boolean_expr;
options {
output=AST;
}
tokens {
WORD;
}
evaluator
: expr EOF
;
...
word
: QUOTED_TEXT
| TEXT+ -> ^(WORD TEXT+)
;
...