У меня есть всего несколько навыков в 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 "("