Как оптимизировать грамматику для парсера Lark - PullRequest
0 голосов
/ 26 апреля 2020

Моя цель - создать парсер, который можно использовать для разбора файлов DB C. Синтаксис форматирования файла: , заданный здесь .

. Для этого я выбираю Lark-парсер, основанный на превосходном учебнике по JSON.

Я создал грамматику файл, основанный на вышеупомянутом связанном документе и запустил автономный скрипт генератора синтаксического анализатора. К сожалению, он все еще работает через 30 минут, и теперь процесс занимает 7,5 ГБ памяти. Это неприемлемо.

Что я мог сделать, чтобы он успешно генерировал код парсера?

1 Ответ

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

Оказалось, что проблема вызвана слишком большим количеством необязательных терминов в одном правиле. Это можно исправить, разбив правило на множество других, но каждый с меньшим количеством дополнительных терминалов.

Например:

start : [ "a" ["b"]  ["b1"]  ["b2"]  ["b3"] ["c"]  ["c1"]  ["c2"]  ["c3"] ["d"]  ["d1"]  ["d2"]  ["d3"] ["e"]  ["e1"]  ["e2"]  ["e3"] ["f"]  ["f1"]  ["f2"]  ["f3"]]

заменяется на:

start : [ "a" b c d e f ]
b: ["b"]  ["b1"]  ["b2"]  ["b3"]
c: ["c"]  ["c1"]  ["c2"]  ["c3"]
d: ["d"] ["d1"]  ["d2"]  ["d3"] 
e:  ["e"]  ["e1"]  ["e2"]  ["e3"]
f:  ["f"]  ["f1"]  ["f2"]  ["f3"]

См. Выпуск Github

...