Использование Parsec с Data.Text

Используя Parsec 3.1 , можно анализировать несколько типов входных данных:

  • [Char] с Text.Parsec.String
  • Data.ByteString с Text.Parsec.ByteString
  • Data.ByteString.Lazy с Text.Parsec.ByteString.Lazy

Я не вижу ничего для модуля Data.Text . Я хочу анализировать содержимое Unicode, не страдая от недостатков String . Итак, я создал следующий модуль на основе модуля Text.Parsec.ByteString :

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Text.Parsec.Text
    ( Parser, GenParser
    ) where

import Text.Parsec.Prim

import qualified Data.Text as T

instance (Monad m) => Stream T.Text m Char where
    uncons = return . T.uncons

type Parser = Parsec T.Text ()
type GenParser t st = Parsec T.Text st
  1. Имеет ли смысл это делать?
  2. Совместимо ли это с остальной частью Parsec API?

Дополнительные комментарии:

Мне пришлось добавить прагму {- # LANGUAGE NoMonomorphismRestriction # -} в мои модули синтаксического анализа, чтобы заставить его работать.

Парсинг Текст - это одно , создание AST с помощью текста - другое дело. Мне также нужно будет упаковать мою строку перед возвратом:

module TestText where

import Data.Text as T

import Text.Parsec
import Text.Parsec.Prim
import Text.Parsec.Text

input = T.pack "xxxxxxxxxxxxxxyyyyxxxxxxxxxp"

parser = do
  x1 <- many1 (char 'x')
  y <- many1 (char 'y')
  x2 <- many1 (char 'x')
  return (T.pack x1, T.pack y, T.pack x2)

test = runParser parser () "test" input
33
задан recursion.ninja 20 August 2015 в 19:39
поделиться