Является ли грамматика Гроффа LALR(1)?
Как домашний проект, я пытаюсь создать синтаксический анализатор groff с Jison (клон Bison на JavaScript), но я изо всех сил пытаюсь понять, является ли грамматика groff LALR(1).
У кого-нибудь есть понимание этого?
Заранее спасибо.
Обновление 1
В ответ на беспокойство Брайана, вот больше деталей о моей проблеме:
Groff написан на C++ и не использует Bison, я сам получаю грамматику.
Я загрузил все мои успехи здесь
2 ответа
Большая часть работы по синтаксическому анализу troff является лексической, хотя вы можете использовать синтаксический анализатор для оценки арифметических выражений. В противном случае "грамматика" - это просто вопрос идентификации контрольных линий и разбиения их на аргументы (опять же, по сути, лексические).
Если вы намереваетесь реализовать элементы управления, которые изменяют управляющие и экранирующие символы (.cc
, .c2
, .ec
а также .eo
), тогда вы найдете скомпилированные регулярные выражения неудобными, хотя обходной путь для управляющих символов не является ужасным.
Я думаю, что я был бы склонен ограничить использование jison частями языка, такими как арифметические выражения.
Конечно, Jison пригодится для препроцессоров, таких как eqn
В случае, если это в ваших планах.
Как сказал @nci, большая часть работы по синтаксическому анализу просто лексическая; кроме выражений (и, возможно, макросов / отклонений) сам язык запроса / экранирования, вероятно, является LL(1); Джисон / Бизон почти наверняка справится с этой задачей, и, вероятно, излишне.
Исходя из вашего кода, похоже, что вы реализуете парсер специально для manpages, а не для общего ввода troff. Если это так, это упрощает то, что вам нужно обрабатывать; Обычно man-страницы не используют условную логику или макросы (хотя сами макросы могут это делать).