Привет эксперты ANTLR, мне нужна ваша помощь!
Я давно использую ANTLR и написал несколько парсеров, использующих ANTLR4. Я использую сейчас версию 4.5.3.
Хорошо, я пишу синтаксический анализатор c ++ с целью Javascript. До этого времени все было довольно гладко. Затем я попытался проанализировать iostream.h (на самом деле с небольшим основным и использовал Xcode llvm для предварительной обработки). Это более 30000 строк кода размером 1,2 МБ. Есть ошибки, но они могут быть исправлены. Проблема в том, что я вывожу это из памяти.
375416 мс: развертка отметки 1349,2 (1422,3) -> 1349,0 (1432,3) МБ, 719,3 / 0 мс [ошибка выделения] [запрошено GC в старом пространстве]. 376141 мс: развертка по метке 1349,0 (1432,3) -> 1349,0 (1433,3) МБ, 725,6 / 0 мс [ошибка выделения] [запрошено GC в старом пространстве]. 376900 мс: развертка по метке 1349,0 (1433,3) -> 1349,0 (1433,3) МБ, 758,7 / 0 мс [последнее средство gc]. 377632 мс: развертка по метке 1349,0 (1433,3) -> 1349,0 (1433,3) МБ, 731,9 / 0 мс [в крайнем случае, gc]. ==== Трассировка стека JS =============== ========================== Контекст безопасности: 0x973d6c9e59 1: Join (он же Join) [native array.js: 179] [pc = 0x109304f3a6b5] (this = 0x973d604189, w = 0x109e7ca91511, x = 108, N = 0x1a20734ed919, M = 0x973d6b4a11) 2: InnerArrayJoin (он же InnerArrayJoin) [native array.js: ~ 343] [pc = 0x109304f1afac] (это = 0x973d604189, N = 0x1a20734ed919, w = 0 ... ФАТАЛЬНАЯ ОШИБКА: CALL_AND_RETRY_LAST Распределение не удалось - куча JavaScript не хватает памяти Ловушка отмены: 6
Мой главный сейчас такой
пытаться { text = fs.readFileSync (filepath, 'utf8'); var chars = new antlr4.InputStream (text); var lexer = новый CPP14Lexer.CPP14Lexer (символы); var tokens = new antlr4.CommonTokenStream (лексер); var parser = новый CPP14Parser.CPP14Parser (токены); вар принтер; пытаться { // Режим SLL parser.buildParseTrees = true; parser.setTrace (this.trace); var cache = new PredictionContextCache (); var sim = новый ParserATNSimulator (синтаксический анализатор, parser._interp.atn, parser._interp.decisionToDFA, кэш); sim.parser._interp.predictionMode = PredictionMode.SLL; var tree = sim.parser.translationunit (); printer = new listener.CPPXXPrinter (токены, лексеры, парсер, this.debug); antlr4.tree.ParseTreeWalker.DEFAULT.walk (принтер, дерево); } ловить ...
Он пытается построить синтаксическое дерево для всего ввода. У меня вопрос, есть ли способы сделать что-то в режиме экономии памяти, например, вообще не создавать дерево и просто анализировать ввод?
Спасибо
-Yoshi
Задача ещё не решена.
Других решений пока нет …