Parsec: прогнозирующий разбор - PullRequest
3 голосов
/ 08 марта 2012

У меня есть всего несколько навыков в haskell, и мне нужна помощь, как реализовать прогностический анализ (LL *) с парсек.

У меня есть контекстно-свободная грамматика:

<a> ::= identifier | identifier '(' <args> ')'

На основе http://research.microsoft.com/en-us/um/people/daan/download/parsec/parsec.pdf (синтаксические анализаторы главы) я написал этот код:

term =  do{ x <- m_identifier
    ; try( char '(' )
    ; b <- argsparser
    ; char ')'
    ; return (FncCall x b)
    }
<|> do { x <- m_identifier
    ; return (VarId x)
    }

Я ожидал, что этот код попытается сопоставить '(' и, если нет, анализатор продолжит работу и сопоставит только идентификатор. Этот код работает только для сопоставления идентификатора '(' args ')'.

При вызове его только по идентификатору "a" он выдает:

parse error at (line 1, column 2):
unexpected end of input
expecting letter or digit or "("

1 Ответ

6 голосов
/ 08 марта 2012

вся альтернативная часть должна быть под попробовать , я думаю:

term =  try( do{ x <- m_identifier
    ; char '('
    ; b <- argsparser
    ; char ')'
    ; return (FncCall x b)
    } )
<|> do { x <- m_identifier
    ; return (VarId x)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...