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

Parsing 支持布尔表达式中的可选引号 背景,parsing,antlr,antlrworks,Parsing,Antlr,Antlrworks,我已经使用ANTLRWorks(V1.4.3)几天了,并试图编写一个简单的布尔解析器。下面的组合lexer/parser语法适用于大多数需求,包括支持将带引号的白间隔文本作为布尔表达式的操作数 问题 我希望语法适用于不需要引号的白间隔操作数 例子 例如,表达式- “左-右”和中间 即使在删除引号后,也应具有相同的分析树- 左右和中间 我一直在学习回溯、谓词等,但似乎找不到解决方案 代码 下面是到目前为止我掌握的语法。任何关于愚蠢错误的反馈都将不胜感激:) 词法分析器/语法分析器 gramm

我已经使用ANTLRWorks(V1.4.3)几天了,并试图编写一个简单的布尔解析器。下面的组合lexer/parser语法适用于大多数需求,包括支持将带引号的白间隔文本作为布尔表达式的操作数


问题 我希望语法适用于不需要引号的白间隔操作数


例子 例如,表达式-

“左-右”和中间

即使在删除引号后,也应具有相同的分析树-

左右和中间

我一直在学习回溯、谓词等,但似乎找不到解决方案


代码 下面是到目前为止我掌握的语法。任何关于愚蠢错误的反馈都将不胜感激:)

词法分析器/语法分析器

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+)
    ;

...