Я пытаюсь сделать это:
Разобрать текст в виде:
Некоторый текст # {0,0,0}, некоторый текст # {0,0,0} # {0,0,0} more Text # {0,0,0}
в список структуры данных:
[Inside "Some Text", Снаружи (0,0,0), внутри" некоторый текст ", снаружи (0,0,0), снаружи (0,0,0), внутри" больше текста ", снаружи (0,0,0)]
Таким образом, эти # {a, b, c} -биты должны превращаться в разные вещи, как и остальная часть текста.
У меня есть этот код:
module ParsecTest where
import Text.ParserCombinators.Parsec
import Monad
type Reference = (Int, Int, Int)
data Transc = Inside String | Outside Reference
deriving (Show)
text :: Parser Transc
text = do
x <- manyTill anyChar ((lookAhead reference) <|> (eof >> return (Inside "")));
return (Inside x)
transc = reference <|> text
alot :: Parser [Transc]
alot = do
manyTill transc eof
reference :: Parser Transc
reference = try (do{ char '#';
char '{';
a <- number;
char ',';
b <- number;
char ',';
c <- number;
char '}';
return (Outside (a,b,c)) })
number :: Parser Int
number = do{ x <- many1 digit;
return (read x) }
Это работает, как и ожидалось.Вы можете проверить это в ghci, набрав
parseTest alot "Some Text # {0,0,0} some Text # {0,0,0} # {0,0,0} more Text# {0,0,0} "
Но я думаю, что это нехорошо.
1) Действительно ли использование lookAhead
действительно необходимо для моей проблемы?
2) Является ли return (Inside "")
безобразным хаком?
3) Есть ли вообщеболее сжатый / умный способ архивировать то же самое?