PROBLEM:
solution "X"= [(Var "X","")]
solution "x"= [(App "x" [],"")]
solution "f(a,X)"= [(App "f" [App "a" [],Var "X"],"")]
solution "f(a,X)zzz"= [(App "f" [App "a" [],Var "X"],"zzz")]
solution "X(b,c)"= [(Var "X","(b,c)")]
solution "x()"= [(App "x" [],"()")]
ROWZIĄZANIE:
module Solution where
import Data.Char
data Term = App String [Term] | Var String deriving (Read, Show)
defTerm stack full =
if null stack then
(False, (Var "", ""))
else if null $ tail stack then
let firstFun = snd $ head stack
in (True, (App firstFun [], drop (length firstFun) full))
else defTerm (tail stack) full
solu x state bros name stack full =
(\parRes ->
if fst parRes then
parRes
else (False, (Var "", x))) (
case state of
't' ->
case x of
a:b ->
if isUpper a then
solu b 'v' bros [a] stack full
else if isLower a then
solu b 'f' bros [a] stack full
else defTerm stack full
_ -> defTerm stack full
'f' ->
case x of
a:b ->
if isAlphaNum a then
solu b 'f' bros ([a] ++ name) stack full
else if a == '(' then
solu b 't' [] [] ([(bros, reverse name)] ++ stack) full
else if null stack then
(True, (App (reverse name) [], x))
else if a == ',' then
solu b 't' ([App (reverse name) []] ++ bros)
[] stack full
else if a == ')' then
solu b ')'
([App (reverse name) []] ++ bros)
[] stack full
else defTerm stack full
_ ->
if null stack then
(True, (App (reverse name) [], ""))
else defTerm stack full
'v' ->
case x of
a:b ->
if isAlphaNum a then
solu b 'v' bros ([a] ++ name) stack full
else if null stack then
(True, (Var (reverse name), x))
else if a == ',' then
solu b 't'
([Var (reverse name)] ++ bros) [] stack full
else if a == ')' then
solu b ')'
([Var (reverse name)] ++ bros)
[] stack full
else defTerm stack full
_ ->
if null stack then (True, (Var (reverse name), ""))
else defTerm stack full
')' ->
case x of
a:b ->
if null $ tail stack then
(True, (App (snd $ head stack) (reverse bros), x))
else
let nBros = [App (snd $ head stack) (reverse bros)] ++ (fst $ head stack)
in
if a == ')' then
solu b ')' nBros [] (tail stack) full
else if a == ',' then
solu b 't' nBros [] (tail stack) full
else defTerm stack full
_ ->
if null $ tail stack then
(True, (App (snd $ head stack) (reverse bros), ""))
else defTerm stack full
)
solution x = let (parsable, sol) = solu x 't' [] [] [] x in
if parsable then [sol] else []