Вы не можете использовать разделитель лексера (= токенизатор) и анализатор для 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).
)