У меня есть только несколько навыков с haskell, и мне нужна помощь в реализации интеллектуального разбора (LL *) с парсеком.Parsec: Предсказательный разбор
У меня есть бесконтекстный грамматик:
<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 "("
Я не верю, что вам нужно 'try' или LL (*) для этого. «Идентификатор» является общим префиксом обоих производств, поэтому анализируем «идентификатор» и необязательно анализируем парсеры и аргументы функции. Возвращает идентификатор, если суффикс функции не работает. –