gpt4 book ai didi

ANTLR : expression evaluator, split 和战俘

转载 作者:行者123 更新时间:2023-12-02 00:29:49 29 4
gpt4 key购买 nike

我正在尝试编写一个语法来评估表达式。
我从 ANTLR 网站上的给定示例开始(它管理 +、- 和 *)。我加了部门。但如果他试图除以 0,我想通知用户。此外,我想在我的求值器中添加 pow(优先级高于乘法和除法。(例如 2^3=8)。
希望这是可以理解的。
这是我的语法 Expr.g :

grammar Expr;

@header {
import java.util.HashMap;
}

@members {
/** Map variable name to Integer object holding value */
HashMap memory = new HashMap();
}

prog: stat+ ;

stat: expr NEWLINE {System.out.println($expr.value);}
| ID '=' expr NEWLINE
{memory.put($ID.text, new Integer($expr.value));}
| NEWLINE
;

expr returns [int value]
: e=multExpr {$value = $e.value;}
(( '+' e=multExpr {$value += $e.value;}
| '-' e=multExpr {$value -= $e.value;}
))*
;

multExpr returns [int value]
: e=atom {$value = $e.value;}
('*' e=atom {$value *= $e.value;}
|'/' e=atom {if (e != 0) $value /= $e.value;
else System.err.println("Division par 0 !");}
)*
;

atom returns [int value]
: INT {$value = Integer.parseInt($INT.text);}
| ID
{
Integer v = (Integer)memory.get($ID.text);
if ( v!=null ) $value = v.intValue();
else System.err.println("Variable indéfinie "+$ID.text);
}
| '(' expr ')' {$value = $expr.value;}
;

ID : ('a'..'z'|'A'..'Z')+ ;
INT : '0'..'9'+ ;
NEWLINE:'\r'? '\n' ;
WS : (' '|'\t')+ {skip();} ;

提前致谢。编辑

最佳答案

eouti wrote:

I added the division. But I would like to notify user if he tries to divide by 0.

在您的 multExpr 规则中,您不应该执行 if (e != 0) ...,但您应该访问 evalue 属性。此外,表达式的左侧称为 e,而右侧也称为 e。你最好给他们起唯一的名字:

multExpr returns [int value]
: e1=atom {$value = $e1.value;}
( '*' e2=atom {$value *= $e2.value;}
| '/' e2=atom {if ($e2.value != 0) $value /= $e2.value;
else System.err.println("Division par 0 !");}
)*
;

但是,您真的要警告用户吗?在此警告之后,计算将继续进行。 IMO,你应该让异常被抛出。

eouti wrote:

I would like to add the pow in my evaluator (with an higher precedence than multiply and divide.

然后在multExpratom之间添加一个powExpr规则,让multExpr使用这个powExpr 规则而不是 atom 规则:

multExpr returns [int value]
: e1=powExpr {...}
( '*' e2=powExpr {...}
| '/' e2=powExpr {...}
)*
;

powExpr returns [int value]
: atom {...}
('^' atom {...}
)*
;

atom returns [int value]
: INT {...}
| ID {...}
| '(' expr ')' {...}
;

(powExpr 当然不需要在这些规则之间...)

此外,您可能希望将 returns [int value] 更改为 returns [double value],尤其是因为您正在使用除法。

关于ANTLR : expression evaluator, split 和战俘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7501430/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com