2012-03-08 1 views
3

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

Я не верю, что вам нужно 'try' или LL (*) для этого. «Идентификатор» является общим префиксом обоих производств, поэтому анализируем «идентификатор» и необязательно анализируем парсеры и аргументы функции. Возвращает идентификатор, если суффикс функции не работает. –

ответ

6

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

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

Он выдает ошибку компиляции: ошибка синтаксического анализа на входе '<- ' – 312k1t

+0

@ 312k1t См. Мое редактирование: он должен скомпилироваться сейчас. Это работает? – dave4420

+0

Теперь это работает. Спасибо – 312k1t