2017-05-07 2 views
0

J'essaie de faire antrl4 4.6. travail mais j'ai 4 erreurs qui sont avancées et je ne peux pas les traverser. Quelqu'un peut-il m'aider s'il-vous-plaît? Peut-être besoin de classe anonyme.Antlr4.6 Erreurs BaseVisitor et Visiteur: Visiteur (Interface) est abstrait; ne peut pas être instancié BaseVisitor (Class) & super() errore

Aussi l'erreur super(), je l'ai dans la position correcte, mais il refuse de travailler.

Yoco.java:34: error: YocoVisitor is abstract; cannot be instantiated 
     YocoVisitor eval = new YocoVisitor(dictInt, dictProcD); 
         ^YocoBaseVisitor.java:6: error: YocoBaseVisitor is not abstract and does not override abstract method visitR(RContext) in YocoVisitor public class YocoBaseVisitor extends AbstractParseTreeVisitor<Integer> implements YocoVisitor<Integer> { 
     ^YocoBaseVisitor.java:12: error: method does not override or implement a method from a supertype 
     @Override public Integer visitR(HashMap<String, Integer> _dictInt, HashMap<String, YocoParser.ProcDefContext> _dictProcD) { 
     ^YocoBaseVisitor.java:13: error: call to super must be first statement in constructor 
>     super(); 
        ^4 errors 

YocoBaseVisitor.java: 


// Generated from Yoco.g4 by ANTLR 4.6 
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; 
import org.antlr.v4.runtime.tree.ParseTreeVisitor; 
import java.util.HashMap; 
public class YocoBaseVisitor extends AbstractParseTreeVisitor<Integer> implements YocoVisitor<Integer> { 
    HashMap<String, Integer> dictInt = new HashMap<String, Integer>(); 
    HashMap<String, YocoParser.ProcDefContext> dictProcD = new HashMap<String, YocoParser.ProcDefContext>(); 
    @Override public Integer visitR(HashMap<String, Integer> _dictInt, HashMap<String, YocoParser.ProcDefContext> _dictProcD) { 
     super(); 
     dictInt = _dictInt; 
     dictProcD = _dictProcD; 
    } 
} 

YocoVisitor.java: 
{ 

import org.antlr.v4.runtime.tree.ParseTreeVisitor; 
public interface YocoVisitor<Integer> extends ParseTreeVisitor<Integer> { 
} 


Yoco.java: 

public class Yoco { 
    public static void main(String[] args) throws Exception { 
     String inputFile = null; 
     if(args.length > 0) 
     inputFile = args[0]; 
     InputStream is = System.in; 
     if (inputFile != null) 
     is = new FileInputStream(inputFile); 

     ANTLRInputStream input = new ANTLRInputStream(is); 
     YocoLexer lexer = new YocoLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     YocoParser parser = new YocoParser(tokens); 

     ParseTree tree = parser.r(); 
     System.out.println(tree.toStringTree(parser)); 

    // Hash table for integer variables. 
    HashMap<String, Integer> dictInt = new HashMap<String, Integer>(); 

    // Hash table for procedure expressions with parameters. 
    HashMap<String, YocoParser.ProcDefContext> dictProcD = new HashMap<String, YocoParser.ProcDefContext>(); 

    YocoVisitor eval = new YocoVisitor(dictInt, dictProcD); 
    System.out.println(); 
    eval.visit(tree); 
    } 
} 
} 

Répondre

1

Erreur 1 -> YocoVisitor est une interface et l'interface ne peut pas être instanciée. Au lieu de YocoVisitor eval = new YocoVisitor (dictInt, dictProcD); Il faut écrire et créer le constructeur correspondant dans YocoBaseVisitor YocoVisitor eval = new YocoBaseVisitor (dictInt, dictProcD);

Erreur 2 -> super() ne peut être appelé dans le constructeur de la classe que comme première ligne. Vous avez appelé la méthode.

Erreur 3 -> méthode visitR est remplacée correctement vérifier la syntaxe.

Nous espérons pouvoir résoudre tous les problèmes.