Является ли грамматика Гроффа 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-страницы не используют условную логику или макросы (хотя сами макросы могут это делать).

Другие вопросы по тегам