Я пытаюсь найти что-то, что будет анализировать очень большие файлы (файлы PGN, в основном). Я начал использовать antlr4, но хотя они утверждают, что их классы являются «потоками», это не так. antlr4 берет мой тестовый файл с игрой 5 457 518 и пытается загрузить весь файл 1.7G в гигантскую строку c, а затем проанализировать ее, что приводит к нехватке памяти cra sh. Таким образом, я выбросил это и теперь пытаюсь moo / nearley.
Хорошо, у меня есть подобная проблема, это кажется. Несмотря на то, что как moo, так и nearley предоставляют методы, имеющие в качестве параметра так называемый «чанк», moo, в частности, не понимает, что он находится в конце строки и может получить больше при следующем moo.feed.
Моя тестовая программа, например, пытается отправить это в moo по два байта за раз: [Abcde "bc def"]
. Он выплевывает LBRACKET
правильно, но затем выплевывает A
как символ. Если я наберу moo.reset(next_two)
, то он будет выплевывать bc
в качестве второго символа.
Итак, мой вопрос, как именно вы, мастер лексер / парсер, делаете это? Должен ли я go вернуться к antlr4? Должен ли я использовать moo / nearley по-другому? Есть ли лучший лексер / парсер? Я действительно не хочу писать свои собственные с нуля, но я действительно начинаю задумываться, есть ли другой способ.