Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
p_and ((t:ts),f) vi vs s i m c =
case M.lookup (t,i) c of
Just v ->
case v of
Left (m,i1,s1) -> p_and (ts,f) (i1+vi) (s1:vs) s (i+i1) (max m (i + i1)) c
Right i2 -> N i2 c
Nothing ->
case call t s i m c of
P m i1 s1 c -> p_and (ts,f) (i1+vi) (s1:vs) s (i+i1) (max m (i + i1)) (M.insert (t,i) (Left (m,i1,s1)) c)
N i2 c -> N (max m i2) (M.insert (t,i) (Right i2) c)
p_and ([],f) vi vs s i m c =
P m vi (f (reverse vs)) c
p_or (o:os) s i m c =
case p_and o 0 [] s i m c of
P m i s c -> P m i s c
N i2 c -> p_or os s i (max i2 m) c
p_or [] s i m c =
N (max i m) c
call Tletters =
p_or [
([Tletter, Tletters], \(Sc n i:Ss n2 _:[]) -> Ss (n:n2) i)
,([Tletter], \(Sc n i:[]) -> Ss (n:"") i)
]
call Tvar =
p_or [
([Tletters,Tnum_pos], \(Ss s i:Sn n _:[]) -> Ss (s++show n) i)
,([Tletters], \(Ss s i:[]) -> Ss s i)
]
Написание парсера с нуля: так ли страшен черт?