Используя парсек за лексический&разбора


Я создаю список токеновиз входной [Чара] поток через парсек В3. Определение маркеров выглядит так:

data Token = CharKeyword | OpeningBracket | Identifier String | Natural Int

Как результат вызова парсинга lexComb "" ридера у меня [маркер]. Все ок до сих пор.

Сейчас я хочу разобрать этот список лексем с помощью другого разбора вызова, но я нашел себя писать такой шаблонный код для каждого маркера конструктора:

psOpBracket = tokenPrim s np p
    where
        s _ = "'{'"
        p (OpeningBracket) = Just Nothing
        p _ = Nothing
        np pos _ _  = pos

другой пример:

psPacketName = tokenPrim s np p
    where
        s x = x
        p (Identifier x) = Just x
        p _ = Nothing
        np pos _ _  = pos

Я интересно, если это правильно использовать tokenPrim на всех. И если так, есть ли способ, чтобы автоматически генерировать Парсеры для каждого маркера? Может Быть, Шаблон Хаскелл?



806
6
задан 11 декабря 2011 в 02:12 Источник Поделиться
Комментарии
1 ответ

Я решил его с помощью текста.ParserCombinators.Парсек.GeneralizedToken от MissingH пакет:

psOpBracket = tokeng (\x -> case x of TokOpBracket -> Just Nothing ; _ -> Nothing)

Мне пришлось использовать tokenPrim для случаев, когда знак конструктор не принимает аргументов, хотя.

1
ответ дан 16 декабря 2011 в 03:12 Источник Поделиться