Я не понимаю, как использовать функцию лексемы

С 1_:

lexeme p = do { x <- p; whiteSpace; return x }

Похоже, что лексема берет синтаксический анализатор p и предоставляет синтаксический анализатор, который имеет то же поведение, что и p, за исключением того, что он также пропускает все конечные пробелы. Верный?

Тогда почему не работает следующее:

constant :: Parser Int
constant = do
    digits <- many1 digit
    return (read digits)

lexConst :: Parser Int
lexConst = lexeme constant

Последняя строка приводит к следующему сообщению об ошибке:

Couldn't match expected type `ParsecT
                                String () Data.Functor.Identity.Identity Int'
            with actual type `ParsecT s0 u0 m0 a0 -> ParsecT s0 u0 m0 a0'
Expected type: Parser Int
  Actual type: ParsecT s0 u0 m0 a0 -> ParsecT s0 u0 m0 a0
In the return type of a call of `lexeme'
In the expression: lexeme constant

Что я делаю не так?


person fredoverflow    schedule 06.05.2013    source источник


Ответы (2)


Вы неправильно поняли документацию, lexeme< /a>, экспортируемое из Text.Parsec.Token, является полем GenTokenParser s u m, поэтому тип

lexeme :: GenTokenParser s u m -> ParsecT s u m a -> ParsecT s u m a

и вы не указали аргумент GenTokenParser в lexeme constant.

Вам нужно создать GenTokenParser из GenLanguageDef (обычно с makeTokenParser) первым использует свое поле lexeme.

person Daniel Fischer    schedule 06.05.2013

Функция lexeme является средством доступа к записи GenTokenParser анализаторов, сгенерированных makeTokenParser, поэтому вам нужно применить ее к такой записи, чтобы получить доступ к ней. Одним из распространенных способов сделать это является использование подстановочных знаков записи, например.

{-# LANGUAGE RecordWildCards #-}

import qualified Text.Parsec.Token as Tok

Tok.TokenParser { .. } = Tok.makeTokenParser {- language definition -}

Это приведет к тому, что lexeme и все остальные парсеры уже будут применены к записи, так что вы сможете использовать их так, как вы пытались это сделать.

person hammar    schedule 06.05.2013