Почему нельзя использовать LEX / YACC для разбора C ++ для компилятора?

Я знаю, что есть причина, но я не нашел хорошего, краткого объяснения того, почему LEX / YACC нельзя использовать для C ++.
Мне также интересно узнать, можно ли использовать LEX / YACC для анализа цели C, или же этот язык страдает от той же проблемы. (Имейте в виду, я имею в виду ObjC, а не Obj-C ++.)
Благодарю.

3

Решение

Конечно, можно использовать lex и yacc для разбора c ++, но вам также потребуется множество других механизмов. Одно время gcc использовал синтаксический анализатор на основе yacc, но его заменили созданным вручную синтаксическим анализатором рекурсивного спуска, который, как считается, легче поддерживать и который упрощает генерацию значимых синтаксических ошибок. Clang использует встроенный парсер рекурсивного спуска по той же причине.

Bison может создавать парсеры GLR, что значительно упрощает поиск альтернативных парсингов (необходимых для правил устранения неоднозначности). Смотрите ответ Ира Бакстера на Парсеры GCC и Clang действительно написаны от руки? для некоторого свидетельства о синтаксическом анализе GLR C ++.

Также см. Ссылки в ответе Мэтью Слэттери на тот же вопрос для некоторой предыстории о gcc и clang; в частности, сводка затрат и выгод, полученных в 2008 году за замену старого синтаксического анализатора yacc в gcc, находится на gcc wiki (ссылка скопирована с Мэтью Слэттери).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]