gpt4 book ai didi

java - Antlr4 中未找到 getType() 方法

转载 作者:行者123 更新时间:2023-12-01 22:47:53 25 4
gpt4 key购买 nike

下面的规则是从较大规则中摘录的。请注意语法末尾的可选部分。解析输入后,我们遍历生成的解析树来评估表达式。下面还给出了第一条规则的监听器代码。

arithmeticTerm
: arithmeticFactor (op=(MULT|DIVIDE) arithmeticFactor)*
;

arithmeticFactor: INTEGER /* For now , let it be simple terminal */

监听器

import java.util.ArrayList;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeProperty;

public class PredicateEvaluator extends PredicateGrammarBaseListener {

private ParseTreeProperty<Float> floatValues = new ParseTreeProperty<Float>();
private ArrayList<Float> arithmeticTermFactorList = null;

private void setFloatValue(ParseTree node, float value){
floatValues.put(node, value);
}

private float getFloatValue(ParseTree node){
return floatValues.get(node);
}

public void enterArithmeticTerm(
@NotNull PredicateGrammarParser.ArithmeticTermContext ctx)
{
arithmeticTermFactorList = new ArrayList<Float>();
}

目前,我正在用这种方式评估算术项。我需要检测类型操作并对因子进行除法或乘法。但是,我的编译器找不到 getType() 方法。我查看了antlr4生成的代码,但它不在那里。我正在关注antlr4的创建者的书,他在类似的场景中使用了getType()方法,但同样的事情在这里不起作用。我们将非常感谢您的帮助。

    public void exitArithmeticTerm(
@NotNull PredicateGrammarParser.ArithmeticTermContext ctx)
{
float evaluatedValue = 0.0f;
if (ctx.op == null){
evaluatedValue = getFloatValue(ctx.arithmeticFactor().get(0));
}else{
for(float value : arithmeticTermFactorList){
if(ctx.op.getType() == PredicateGrammarLexer.MULT) {
evaluatedValue *= value;
}else{
evaluatedValue /= value;
}
}
}
arithmeticExprTermList.add(evaluatedValue);
}

public void exitArithmeticFactor(
@NotNull PredicateGrammarParser.ArithmeticFactorContext ctx)
{
Float evaluatedValue = NEGATIVE * Integer.valueOf(ctx.INTEGER().getText());
arithmeticTermFactorList.add(evaluatedValue);
}

}

最佳答案

而不是这样做:

arithmeticTerm
: arithmeticFactor (op=(MULT|DIVIDE) arithmeticFactor)*
;

做这样的事情:

expression
: MINUS expression #unaryMinusExpression
| expression MULT expression #multExpression
| expression DIVIDE expression #divideExpression
| expression ADD expression #addExpression
| expression MINUS expression #minusExpression
| INTEGER #integerExpression
| '(' expression ')' #parensExpression
;

然后在您的监听器中,您只需重写 #...Expression 方法:

@Override
public void enterMultExpression(@NotNull PredicateGrammarParser.MultExpressionContext ctx)
{
...
}

请注意,MULTDIVIDE 表达式的优先级高于 ADDMINUS,因为它们是在之前定义的后者。

关于java - Antlr4 中未找到 getType() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25077236/

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