Является ли сгенерированный синтаксический анализатор c ++ flex стабильным - PullRequest
0 голосов
/ 24 февраля 2019

Я все, я читаю эту книгу , и там говорится, что создание лексера c ++ с помощью flex является ошибочной экспериментальной функцией.

Книга была опубликована в 2009 году, поэтому я хотел быхотел бы знать, если проблема была решена в последние 10 лет.

1 Ответ

0 голосов
/ 24 февраля 2019

Вы не можете использовать разделитель лексера (= токенизатор) и анализатор для C ++, так как разрешены скобки для вложенных шаблонов:

std::map<int,std::map<int,int>>

Это разрешено начиная с C ++ 11 и не может быть чисто обработано с разделениемЛекстер / парсер подход.Проблема заключается в последнем токене (>>), который лексер (который не знает грамматики) будет рассматривать как оператор сдвига вправо.Исправить это в грамматике практически невозможно.

Использование подхода синтаксического анализа, который не различает символы и токены, решает эту проблему.Это означает, что не использование flex решает эту проблему (и многие другие).

Обратите внимание, что flex был в основном изобретен для обхода довольно сильных ограничений синтаксических анализаторов bison / yacc, которые могут анализировать только языки LALR1 с предвосхищениемодин.Этот подход мертв с двух десятилетий.

Не используйте flex / bison / yacc.Вместо этого используйте анализатор рекурсивного спуска PEG (грамматика синтаксического анализа выражения), например, PEGTL (https://github.com/taocpp/PEGTL).

)
...