Parser / Lexer逻辑表达式

时间:2014-08-02 15:42:33

标签: parsing expression antlr grammar antlr4

我设法用Antlr4编写一个解析器/词法分析器用于逻辑表达式。

我唯一的问题是,我无法解决以下问题:

假设我正在将“~p& q”传递给我的程序。它将该公式解释为“〜(p& q)”。 我的问题是我希望在这种情况下将“〜p”解释为对“p”的否定。但我也想要正确解释“〜(p& q)”。

这是我的解析器/词法分析器文件:

grammar LogicFormula;

/*
 * Parser Rules
 */

prog: expr+ ;

expr : expr op='&' expr # AND
     | expr op='|' expr # OR
     | expr op='->' expr # IMPLI
     | expr op='<->' expr # BIIMPLI
     | op='~' expr      # NOT
     | BOOL                 # bool
     | '(' expr ')'         # parens
     ;

/*
 * Lexer Rules
 */
BOOL : [0-1]|[a-zA-Z];
AND : '&';
OR : '|';
NOT: '~';
IMPLI: '->';
BIIMPLI: '<->';
WS
    :   (' ' | '\r' | '\n') -> channel(HIDDEN)
    ;
ErrorCharacter : . ;

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:3)

使用Antlr4非常简单,只需重新排序expr规则:

expr : '(' expr ')'         # parens
     | op='~' expr          # NOT
     | expr op='&' expr     # AND
     | expr op='|' expr     # OR
     | expr op='->' expr    # IMPLI
     | expr op='<->' expr   # BIIMPLI
     | BOOL                 # bool
     ;