Не могу разрешить JavaParser - PullRequest
0 голосов
/ 20 апреля 2020

JavaParser.CallContext и JavaParser.FunctionDeclContext не могут быть разрешены. Это смоделировано после стр. 139 в окончательном справочнике antlr. Я скучаю по Lib?

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.MultiMap;
import org.antlr.v4.runtime.misc.OrderedHashSet;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.*;
import org.stringtemplate.v4.ST;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Set;



 static class FunctionListener extends JavaBaseListener {
            Graph graph = new Graph();
            String currentFunctionName = null;

            public void enterFunctionDecl(JavaParser.FunctionDeclContext ctx) {
                currentFunctionName = ctx.ID().getText();
                graph.nodes.add(currentFunctionName);
            }

            public void exitCall(JavaParser.CallContext ctx) {
                String funcName = ctx.ID().getText();
                // map current function to the callee
                graph.edge(currentFunctionName, funcName);
            }
        }

1 Ответ

0 голосов
/ 21 апреля 2020

Я думаю, что видел это, и у меня недостаточно очков, чтобы «комментировать», но позвольте мне сначала задать вопрос; Похоже, вы пытаетесь создать внешнюю версию AST на стр. 137. Вы взяли примеры и переименовали их в уже созданную вами грамматику. Я собираюсь предположить, что остальная часть работает, или у вас было бы намного больше ошибок, чем этот! Это цель? Вы после просто вызова методов / классов или вы после полного однородного AST?

Это зависит от точек входа грамматики. Это не так очевидно в книге, как кажется. Вы ссылаетесь на functionDecl, который выглядит как запись в Cymbol.g4, но не существует в Java .g4. Поэтому вместо JavaParser.FunctionDeclContext я предлагаю JavaParser.classOrInterfaceDeclarationContext. Следует подтянуть правильный метод. Я также признаюсь, что я не знаю, на что будет отображаться exitCall. Я мог бы использовать освещение на этом сам.

Были ли вы после всего AST или только граф вызовов? Если весь AST, я думаю, что вы можете использовать enterEveryRule или ExitEveryRule для этого, но подтверждение было бы хорошо.

Итак, начните с регенерации вашей грамматики, измените вашу программу так, чтобы она ссылалась на точку входа правила в файлах .g4, а затем посмотрите, все ли работает.

Спасибо

...