Не могу найти символ в Antlr4 - PullRequest
       3

Не могу найти символ в Antlr4

0 голосов
/ 13 сентября 2018

Это мой файл грамматики , а это мой файл SimpleBaseListner.java

// Generated from Simple.g4 by ANTLR 4.7.1
import org.antlr.v4.runtime.tree.ParseTreeListener;

/**
 * This interface defines a complete listener for a parse tree produced by
 * {@link SimpleParser}.
 */
public interface SimpleListener extends ParseTreeListener {
/**
 * Enter a parse tree produced by {@link SimpleParser#file}.
 * @param ctx the parse tree
 */
void enterFile(SimpleParser.FileContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#file}.
 * @param ctx the parse tree
 */
void exitFile(SimpleParser.FileContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#func}.
 * @param ctx the parse tree
 */
void enterFunc(SimpleParser.FuncContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#func}.
 * @param ctx the parse tree
 */
void exitFunc(SimpleParser.FuncContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#arg}.
 * @param ctx the parse tree
 */
void enterArg(SimpleParser.ArgContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#arg}.
 * @param ctx the parse tree
 */
void exitArg(SimpleParser.ArgContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#body}.
 * @param ctx the parse tree
 */
void enterBody(SimpleParser.BodyContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#body}.
 * @param ctx the parse tree
 */
void exitBody(SimpleParser.BodyContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#block}.
 * @param ctx the parse tree
 */
void enterBlock(SimpleParser.BlockContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#block}.
 * @param ctx the parse tree
 */
void exitBlock(SimpleParser.BlockContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#var}.
 * @param ctx the parse tree
 */
void enterVar(SimpleParser.VarContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#var}.
 * @param ctx the parse tree
 */
void exitVar(SimpleParser.VarContext ctx);
/**
 * Enter a parse tree produced by {@link SimpleParser#stat}.
 * @param ctx the parse tree
 */
void enterStat(SimpleParser.StatContext ctx);
/**
 * Exit a parse tree produced by {@link SimpleParser#stat}.
 * @param ctx the parse tree
 */
void exitStat(SimpleParser.StatContext ctx);
}

Когда я компилирую это, используя javac SimpleBaseListner.java, я получаю следующее
Ошибки:

-bash-4.1$ javac SimpleListener.java
./SimpleParser.java:84: error: cannot find symbol
                public Scope scope;
                       ^
symbol:   class Scope
location: class FileContext
./SimpleParser.java:163: error: cannot find symbol
                public Scope scope;
                       ^
symbol:   class Scope
location: class FuncContext
./SimpleParser.java:353: error: cannot find symbol
                public Scope scope;
                       ^
symbol:   class Scope
location: class BlockContext
3 errors

Я новичок в Antlr4, и я не знаю, что здесь не так. Хотя он говорит, что не может найти символ, этот тип Scope определен в файле грамматики. Поэтому, насколько я понимаю, это должно быть определено, когда Antlr4 компилирует файл грамматики.

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 13 сентября 2018

Вам не хватает Scope исходного файла.Найдите его в хранилище, где вы получили файл грамматики: https://github.com/parrt/cs652/search?q=Scope.java&unscoped_q=Scope.java (существует несколько реализаций Scope)

Например, это:

// source: https://github.com/parrt/cs652/blob/master/labs/symtab-mono/src/symtab/BasicScope.java
package symtab;

import java.util.HashMap;
import java.util.Map;

public class BasicScope implements Scope {
    public Map<String,Symbol> symbols = new HashMap<>();

    @Override
    public String getScopeName() {
        return "<unknown>";
    }

    @Override
    public void define(Symbol s) {
        symbols.put(s.name, s);
    }

    @Override
    public Symbol resolve(String name) {
        Symbol s = symbols.get(name);
        if ( s!=null ) return s;
        if ( getEnclosingScope()!=null ) {
            return getEnclosingScope().resolve(name);
        }
        return null;
    }

    @Override
    public Scope getEnclosingScope() {
        return null;
    }
}

, принадлежащий интерфейсу:

// source: https://github.com/parrt/cs652/blob/master/labs/symtab-mono/src/symtab/Scope.java
public interface Scope {
    String getScopeName();
    void define(Symbol s);
    Symbol resolve(String name); // bind or lookup
    Scope getEnclosingScope();
}

Другие классы, которые могут вам понадобиться, можно найти здесь: https://github.com/parrt/cs652/tree/master/labs/symtab-mono/src/symtab

...