Должно быть довольно легко создать рекурсивный анализатор обратного отслеживания, который принимает грамматику в качестве входных данных.Вы можете свести все свои правила к следующей форме (или действовать так, как если бы у вас есть):
A = B C D ;
Анализ такого правила с помощью рекурсивного спуска очень прост: вызов подпрограммы, соответствующей поиску B, затем одинкоторый находит C, затем тот, который находит D. Учитывая, что вы выполняете общий анализатор, вы всегда можете вызвать функцию "parse_next_sentential_form (x)" и передать имя нужной формы (терминальный или нетерминальный токен) как x (например, "B", "C", "D").
При обработке такого правила синтаксический анализатор хочет создать A, найдя B, затем C, затем D. Чтобы найти B (или C или D), вы хотели бы иметь индексированный набор правил, в котором все левые части одинаковы, так что можно легко перечислить правила, производящие B, и вернуться к обработке их содержимого.Если ваш парсер получает ошибку, он просто возвращается назад.
Это не будет молниеносным парсером, но не должен быть ужасным, если его правильно реализовать.
Можно также использовать парсер Earley, который анализирует путем создания состояний частично обработанных правил.
Если вы хотите, чтобы это было быстро, я полагаю, вы могли бы просто взять смелость Бизона и превратить его в библиотеку.Затем, если у вас есть грамматический текст или грамматические правила (разные точки входа в Bison), вы можете запустить его и заставить его создавать свои таблицы в памяти (что он должен делать в некоторой форме).Не выплевывайте их;просто создайте механизм синтаксического анализа LR, который их использует.Вуаля, эффективное поколение анализаторов на лету.Если вы делаете это, вам нужно беспокоиться о неясностях и LALR (1) вашей грамматики;предыдущие два решения работают с любой контекстно-свободной грамматикой.