Пример синтаксического анализатора ANTLR с грамматикой C ++

Я пытаюсь использовать ANTLR для разбора исходного кода C ++, используя ANTLR C ++ файл грамматики.

После генерации лексера, анализатора и слушателей (CPP14BaseListener.java, CPP14Lexer.java, CPP14Listener.java, CPP14Parser.java), попробуйте запустить его в файле C ++ следующим образом:

private void parseCppFile(String file) throws IOException {
String p1 = readFile(new File(file), Charset.forName("UTF-8"));
System.out.println(p1);
// Get our lexer
CPP14Lexer lexer = new CPP14Lexer(new ANTLRInputStream(p1));
// Get a list of matched tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Pass the tokens to the parser
CPP14Parser parser = new CPP14Parser(tokens);
// Walk it and attach our listener
ParseTreeWalker walker = new ParseTreeWalker();
// Specify our entry point
ParseTree entryPoint = null;//TODO: what is the entry point?
walker.walk(new CPP14BaseListener(), entryPoint);
}

У меня вопрос — какой из сгенерированных CPP14Parser методов использовать для получения точки входа в файл? (см. комментарий TODO).

В качестве альтернативы, любой указатель для рабочего примера, показывающий, как анализировать исходный файл C ++, был бы хорош.

Спасибо!

1

Решение

Точкой входа в грамматику обычно является правило, которое заканчивается EOF, В вашем случае попробуйте translationunit правило:

ParseTree entryPoint = parser.translationunit();

Если люди не читают комментарии, я добавлю заслуживающий внимания комментарий Майка к своему ответу:

… и если это не так (возможно, заканчивается EOF), первое правило синтаксического анализатора в грамматике — это точка входа (особенно, если оно не вызывается откуда-либо). С другой стороны, в одной из моих грамматик я определил полдюжины других правил, которые заканчиваются EOF (в основном для анализа подэлементов моего языка). Иногда это сложно … 🙂

1

Другие решения

Других решений пока нет …