错误-解释器不是抽象的,并且不会覆盖抽象方法

时间:2020-10-08 10:32:44

标签: java api antlr antlr4 interpreter

我已经搜索并查看了该社区的其他主题。要弄清楚“注:main.java使用或覆盖已弃用的API”的含义。我发现或读到这不是错误而是警告?这意味着所使用的代码将来可能不再可用?

好的,我可以从输出中看到我实际上正在犯错误,但似乎无法弄清楚。

main.java:47: error: Interpreter is not abstract and does not override abstract method
visitConstant(ConstantContext) in implVisitor
class Interpreter extends AbstractParseTreeVisitor<Double> implements implVisitor<Double> {

这是什么意思:“解释器不是抽象的,不会覆盖抽象方法”。

错误:

java -jar /usr/local/lib/antlr-4.8-complete.jar -visitor impl.g4
javac  main.java Environment.java implParser.java implBaseVisitor.java implVisitor.java
implLexer.java
main.java:47: error: Interpreter is not abstract and does not override abstract method
visitConstant(ConstantContext) in implVisitor
class Interpreter extends AbstractParseTreeVisitor<Double> implements implVisitor<Double> {
^
Note: main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
**1 error**
make: *** [Makefile:12: main.class] Error 1

这是main.java:

import org.antlr.v4.runtime.tree.ParseTreeVisitor;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import org.antlr.v4.runtime.CharStreams;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException{

// we expect exactly one argument: the name of the input file
if (args.length!=1) {
    System.err.println("\n");
    System.err.println("Simple calculator\n");
    System.err.println("=================\n\n");
    System.err.println("Please give as input argument a filename\n");
    System.exit(-1);
}
String filename=args[0];

// open the input file
CharStream input = CharStreams.fromFileName(filename);
    //new ANTLRFileStream (filename); // depricated

// create a lexer/scanner
implLexer lex = new implLexer(input);

// get the stream of tokens from the scanner
CommonTokenStream tokens = new CommonTokenStream(lex);

// create a parser
implParser parser = new implParser(tokens);

// and parse anything from the grammar for "start"
ParseTree parseTree = parser.start();

// Construct an interpreter and run it on the parse tree
Interpreter interpreter = new Interpreter();
interpreter.visit(parseTree);
}
}
// We write an interpreter that implements interface
// "implVisitor<T>" that is automatically generated by ANTLR
// This is parameterized over a return type "<T>" which is in our case
// simply a Double.
class Interpreter extends AbstractParseTreeVisitor<Double> implements implVisitor<Double> {
static Environment env=new Environment();
public Double visitStart(implParser.StartContext ctx){
for(implParser.CommandContext c:ctx.cs) visit(c);
return null;
};

public Double visitSingleCommand(implParser.SingleCommandContext ctx){
return visit(ctx.c);
}

public Double visitMultipleCommands(implParser.MultipleCommandsContext ctx){
for(implParser.CommandContext c:ctx.cs) visit(c);
return null;
}

public Double visitAssignment(implParser.AssignmentContext ctx){
Double v=visit(ctx.e);
env.setVariable(ctx.x.getText(),v);
return null;
}

public Double visitOutput(implParser.OutputContext ctx){
Double v=visit(ctx.e);
System.out.println(v);
return null;
}

public Double visitWhileLoop(implParser.WhileLoopContext ctx){
while(visit(ctx.c).equals(1.0)){
    visit(ctx.p);
}
return null;
}
public Double visitIfStatement(implParser.IfStatementContext ctx){
while(visit(ctx.c1).equals(1.0)){
    visit(ctx.p1);
}
return null;
}
/*public Double visitSubstraction(implParser.SubstractionContext ctx) {
return visit(ctx.e1);
}
public Double visitDivison(implParser.DivisonContext ctx) {
return visit(ctx.e1);
}*/
 public Double visitMUL(implParser.MULContext ctx) {
    Double left = this.visit(ctx.expr(0));
    Double right = this.visit(ctx.expr(1));
    switch (ctx.op.getType()) {
        case implParser.MULT:
            return left * right;
        case implParser.DIV:
            return left / right;
        case implParser.MOD:
            return left % right;
        default:
            throw new RuntimeException("unknown operator: " + implParser.tokenNames[ctx.op.getType()]);
    }
}

public Double visitOP(implParser.OPContext ctx) {
    Double left = this.visit(ctx.expr(0));
    Double right = this.visit(ctx.expr(1));
    switch (ctx.op.getType()) {
        case implParser.PLUS:
            //return left && right;
                    return left + right;
        case implParser.MINUS:
            return left - right;
        default:
            throw new RuntimeException("unknown operator: " + implParser.tokenNames[ctx.op.getType()]);
    }
}

public Double visitParenthesis(implParser.ParenthesisContext ctx){
return visit(ctx.e);
};

public Double visitVariable(implParser.VariableContext ctx){
return env.getVariable(ctx.x.getText());
};
/*public Double visitAddition(implParser.AdditionContext ctx){
return visit(ctx.e1)+visit(ctx.e2);
};

public Double visitMultiplication(implParser.MultiplicationContext ctx){
return visit(ctx.e1)*visit(ctx.e2);
};
*/
public Double visitConstant(implParser.ConstantContext ctx){
return Double.parseDouble(ctx.c.getText()); 
};

public Double visitUnequal(implParser.UnequalContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitEqual(implParser.EqualContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitLess(implParser.LessContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitLessOrEqual(implParser.LessOrEqualContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitGreater(implParser.GreaterContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitGreaterOrEqual(implParser.GreaterOrEqualContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitAND(implParser.ANDContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitOR(implParser.ORContext ctx){
Double v1=visit(ctx.e1);
Double v2=visit(ctx.e2);
if (v1.equals(v2))  return 0.0;
else return 1.0;
}
public Double visitNum(implParser.NumContext ctx){
    return null;
}
}
/*
class Expr{};
class var extends Expr{}; //Subclass
class Const extends Expr{}; //Subclass
class Multiplication extends Expr{}; //Subclass*/

ddd

// Generated from impl.g4 by ANTLR 4.8
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
public interface implVisitor<T> extends ParseTreeVisitor<T> {
T visitStart(implParser.StartContext ctx);
T visitSingleCommand(implParser.SingleCommandContext ctx);
T visitMultipleCommands(implParser.MultipleCommandsContext ctx);
T visitAssignment(implParser.AssignmentContext ctx);
T visitOutput(implParser.OutputContext ctx);
T visitWhileLoop(implParser.WhileLoopContext ctx);
T visitIfStatement(implParser.IfStatementContext ctx);
T visitOP(implParser.OPContext ctx);
T visitParenthesis(implParser.ParenthesisContext ctx);
T visitVariable(implParser.VariableContext ctx);
T visitMUL(implParser.MULContext ctx);
T visitConstant(implParser.ConstantContext ctx);
T visitNum(implParser.NumContext ctx);
T visitUnequal(implParser.UnequalContext ctx);
T visitEqual(implParser.EqualContext ctx);
T visitLess(implParser.LessContext ctx);
T visitLessOrEqual(implParser.LessOrEqualContext ctx);
T visitGreater(implParser.GreaterContext ctx);
T visitGreaterOrEqual(implParser.GreaterOrEqualContext ctx);
T visitAND(implParser.ANDContext ctx);
T visitOR(implParser.ORContext ctx);
}

任何帮助将不胜感激。

0 个答案:

没有答案