Parsing 语法分析器/词法分析器逻辑表达式

Parsing 语法分析器/词法分析器逻辑表达式,parsing,expression,antlr,grammar,antlr4,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

我设法用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 : . ;
语法逻辑公式;
/*
*解析器规则
*/
prog:expr+;
expr:expr op='&'expr#和
|expr op=“|”expr#或
|expr op='->'expr#IMPLI
|expr op=''expr#BIIMPLI
|op='~'表达式#非
|BOOL#BOOL
|“(‘expr’)”帕伦斯
;
/*
*Lexer规则
*/
布尔:[0-1]|[a-zA-Z];
及:"及",;
或:“|”;
不是:“~”;
IMPLI:“->”;
比因普里:“;
WS
:(“|”\r“|”\n')->频道(隐藏)
;
错误字符:;

有人能帮我一下吗?

使用Antl4这很简单,只需重新排列您的
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
     ;
expr:'('expr')'#parens
|op='~'表达式#非
|expr op='和'expr#和
|expr op=“|”expr#或
|expr op='->'expr#IMPLI
|expr op=''expr#BIIMPLI
|BOOL#BOOL
;

非常感谢卢卡斯,它确实起了作用,现在我的程序可以正确解释所有内容。