Одна из моих программ принимает команды (например, kill foo
) во время выполнения.Думайте об этом как о небольшом предметно-ориентированном языке.Вот несколько примеров:
kill
kill client
exit
Но также разрешены цепочечные команды, и пробел не имеет значения до и после команд, поэтому допустимы также следующие примеры:
kill ; say "that was fun"
kill ; kill ; kill;
Iв настоящее время реализовали это с помощью lex / yacc (если быть точным, flex / bison), и это вызвало много головной боли.Лексер очень сильно зависит от контекста (например, токены пробелов обычно не возвращаются, если, например, после ключевого слова kill
) и имеет много разных состояний.В грамматике возникали конфликты, и мне не очень нравится формат, в котором она должна быть указана (особенно $ 1, $ 2, $ 3,… для использования аргументов для нетерминалов).Кроме того, сообщения об ошибках, которые предоставляет bison (во время анализа), иногда точны, но часто нет (команда kill
с необязательными аргументами приводит к сообщениям об ошибках, таких как Unexpected $undefined, expected $end or ;
для kill clont
вместо kill client
).Наконец, C API для yacc является жестоким (внешний определяет везде).
Я не прошу вас решать все вышеупомянутые вопросы (я открою отдельные темы с более конкретными описаниями и кодом, если естьнет пути к lex / yacc).Вместо этого меня интересуют альтернативы lex / yacc.
Мои критерии следующие:
- Входные данные - это строка (const char *), нет выходных данных, но вместо этого некоторыекод должен вызываться для каждого отдельного ключевого слова.
- Я хочу использовать это с C (C99).
- Программное обеспечение должно быть уже включено в основные дистрибутивы Linux или, по крайней мере, легко объединяться /пакет.
- Это должно быть хорошо задокументировано.
- Синтаксис для описания моего языка должен быть простым.
- Он должен выводить значимые сообщения об ошибках при разборе ошибок.
- Производительность не так важна (конечно, она должна быть быстрой, но типичным вариантом использования является интерактивное использование, а не обработка тонн МБ команд).