支持布尔表达式中的可选引号

时间:2012-07-03 07:25:10

标签: parsing antlr antlrworks

背景

我已经使用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 
    ; 

1 个答案:

答案 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"现在将按以下方式解析:

enter image description here