Я пытаюсь использовать 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 ++, был бы хорош.
Спасибо!
Точкой входа в грамматику обычно является правило, которое заканчивается EOF
, В вашем случае попробуйте translationunit
правило:
ParseTree entryPoint = parser.translationunit();
Если люди не читают комментарии, я добавлю заслуживающий внимания комментарий Майка к своему ответу:
… и если это не так (возможно, заканчивается EOF), первое правило синтаксического анализатора в грамматике — это точка входа (особенно, если оно не вызывается откуда-либо). С другой стороны, в одной из моих грамматик я определил полдюжины других правил, которые заканчиваются EOF (в основном для анализа подэлементов моего языка). Иногда это сложно … 🙂
Других решений пока нет …