УстановкиСинтаксические первое вхождение слова, не precded белого пространства
Мне нужно найти первое вхождение слова в некотором текстовом файле, который не предшествует белым пространством. Вот возможные случаи:
-- * should succed
t1 = "hello\t999\nworld\t\900"
t2 = "world\t\900\nhello\t999\n"
t3 = "world world\t\900\nhello\t999\n"
-- * should fail
t4 = "world\t\900\nhello world\t999\n"
t5 = "hello world\t999\nworld\t\900"
t6 = "world hello\t999\nworld\t\900"
Сейчас t6 преуспевает, хотя он должен потерпеть неудачу, потому что мой анализатор будет потреблять любой символ, пока он не достигнет привет. Вот мой парсер:
мое решение
import Control.Applicative
import Data.Attoparsec.Text.Lazy
import Data.Attoparsec.Combinator
import Data.Text hiding (foldr)
import qualified Data.Text.Lazy as L (Text, pack)
-- * should succed
t1 = L.pack "hello\t999\nworld\t\900"
t2 = L.pack "world\t\900\nhello\t999\n"
-- * should fail
t3 = L.pack "world\t\900\nhello world\t999\n"
t4 = L.pack "hello world\t999\nworld\t\900"
t5 = L.pack "world hello\t999\nworld\t\900"
p = occur "hello"
---- * discard all text until word `w` occurs, and find its only field `n`
occur :: String -> Parser (String, Int)
occur w = do
pUntil w
string . pack $ w
string "\t"
n <- natural
string "\n"
return (w, read n)
-- * Parse a natural number
natural :: Parser String
natural = many1' digit
-- * skip over all words in Text stream until the word we want
pUntil :: String -> Parser String
pUntil = manyTill anyChar . lookAhead . string . pack
Парсер * не * правильный инструмент для «найти первое вхождение х в последовательности у». Вы должны разобрать всю строку в структуру данных, в которой хранятся пары (ключ, значение) вместе с положением, в котором они произошли. Ваша текущая проблема - 't6' содержит две пары ключ/значение (одна во всей строке, одна в суффиксе), так что, естественно, парсер обратной связи находит оба. Разбор каждого ключа безусловно фиксирует это. С attoparsec вы ограничены получением позиции в виде байтового индекса, но этого должно быть достаточно для ваших целей. – user2407038