При написании синтаксического анализатора в библиотеке комбинаторов синтаксического анализатора, такой как Parsec в Haskell, у вас обычно есть 2 варианта:
- Напишите лексер для разделения входных данных
String
на токены, а затем выполните синтаксический анализ[Token]
- Напрямую напишите комбинаторы синтаксического анализатора на
String
Первый метод часто кажется разумным, учитывая, что многие входные данные синтаксического анализа можно понимать как токены, разделенные пробелами.
В других местах я видел, как люди рекомендуют не использовать токенизацию (или сканирование или лексирование, как некоторые это называют), при этом простота является основной причиной.
Каковы общие компромиссы между лексированием и бездействием?