2

背景

几天来,我一直在使用 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 
    ; 
4

1 回答 1

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"现在将被解析如下:

在此处输入图像描述

于 2012-07-03T07:49:09.517 回答