Parsec — это монадическая библиотека синтаксического анализа, поэтому вам, вероятно, следует сначала познакомиться с монадами и синтаксическим сахаром, которым является нотация do.
nesting
— это синтаксический анализатор, который можно рассматривать как вычисление (монаду) с результатом типа Int
. Всякий раз, когда вы видите такой код n <- nesting
в блоке do, это означает запуск вложения монад и привязка результата к n
.
Чтобы увидеть, как работает этот парсер, попробуйте запустить его вручную. Например, используйте строку «()
».
Это выглядит так:
- Tries the parser in the do block, succeeds parsing '
(
', runs the parser recursively and binds the result to n
.
- Tries the parser in the do block, fails parsing '
(
', tries the next parser (return 0
) which always succeeds with the value 0
.
n
теперь имеет значение 0, потому что это результат рекурсивного запуска синтаксического анализатора. Далее в блоке do находится синтаксический анализатор char ')'
, он завершается успешно, снова рекурсивно вызывает синтаксический анализатор и привязывает результат к m
. Как и выше, результат в m
равен 0
.
Теперь весь результат вычислений равен max (n+1) m
, что равно 1
.
Как вы можете видеть, это анализирует вложенные скобки, и примерно на верхнем уровне n
содержит количество проанализированных '('
, а m
содержит количество проанализированных ')'
.
person
edon
schedule
23.03.2011
;
для нотации. - person fuz   schedule 23.03.2011