Это похоже на мою работу, сделанную несколько лет назад.Он был предназначен для модифицированной версии лимона, которую я создал, но больше не поддерживаю, что сгенерировало парсер в Lua.
Чтобы использовать его с готовым парсером лимона, у вас будетзаменить все экземпляры цитируемых литералов именованными токенами.См. Раздел «Терминалы и нетерминалы» в документации lemon .(На странице, на которую вы ссылаетесь, есть примечание.)
В отличие от yacc / bison, лимон не требует от вас объявлять имена токенов, потому что такие имена должны начинаться с заглавной буквы.Как и yacc / bison, lemon создаст заголовочный файл с определениями для этих имен, которые вы можете #include
в своей реализации сканера.(Легко использовать flex для создания сканера для анализаторов лимонов, но вы должны внимательно прочитать документацию лимонов; анализаторы лимонов вызываются сканером, а не вызывать сканер.)
Естьпара лимонных функций, которых нет в yacc / bison, которые могли бы усложнить преобразование этой грамматики для yacc / bison:
Запись |
в лимоне не документирована и отличается от использования|
в яц / бизон;он может использоваться только для создания списка альтернативных терминальных токенов.В yacc / bison вы можете создать нетерминал этой формы, но нетерминалы не участвуют в правилах приоритета;у лимона список альтернатив - «Мультитерминал», который не мешает правилам приоритета.Таким образом, в yacc / bison вам придется дублировать производство, используя альтернативы токенов для каждого альтернативного терминала.Другим подходом yacc / bison будет использование одного лексического токена для всех альтернатив в группе, различая их по их семантическому значению, которое может быть enum
.Это будет хорошо работать для операторских терминалов, но не будет работать для альтернатив, таких как ','|';'
, потому что они не согласованы по всей грамматике.
Не существует эквивалента yacc / bison для %fallback
и при этом нет простого обходного пути.