forked from GitHub/gf-core
Add support for SOFT_SPACE
This commit is contained in:
@@ -90,10 +90,11 @@ mkCanon2lpgf opts gr am = do
|
|||||||
term = foldl L.LFProjection tuple (L.LFInt (pidIx+1):pids')
|
term = foldl L.LFProjection tuple (L.LFInt (pidIx+1):pids')
|
||||||
return term
|
return term
|
||||||
|
|
||||||
|
-- https://www.aclweb.org/anthology/W15-3305.pdf
|
||||||
C.PredefValue (C.PredefId pid) -> case pid of
|
C.PredefValue (C.PredefId pid) -> case pid of
|
||||||
"BIND" -> return L.LFBind
|
"BIND" -> return L.LFBind
|
||||||
"SOFT_BIND" -> return L.LFBind
|
"SOFT_BIND" -> return L.LFBind
|
||||||
-- "SOFT_SPACE" ->
|
"SOFT_SPACE" -> return L.LFSpace
|
||||||
-- "CAPIT" ->
|
-- "CAPIT" ->
|
||||||
-- "ALL_CAPIT" ->
|
-- "ALL_CAPIT" ->
|
||||||
_ -> Left $ printf "Unknown predef function: %s" pid
|
_ -> Left $ printf "Unknown predef function: %s" pid
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ data Concr = Concr {
|
|||||||
data LinFun =
|
data LinFun =
|
||||||
-- Additions
|
-- Additions
|
||||||
LFError String -- ^ a runtime error, should probably not be supported at all
|
LFError String -- ^ a runtime error, should probably not be supported at all
|
||||||
| LFBind -- ^ bind token
|
| LFBind
|
||||||
|
| LFSpace
|
||||||
| LFPre [([String], LinFun)] LinFun
|
| LFPre [([String], LinFun)] LinFun
|
||||||
|
|
||||||
-- From original definition in paper
|
-- From original definition in paper
|
||||||
@@ -127,19 +128,14 @@ type Context = [LinFun]
|
|||||||
eval :: Context -> LinFun -> LinFun
|
eval :: Context -> LinFun -> LinFun
|
||||||
eval cxt t = case t of
|
eval cxt t = case t of
|
||||||
LFError err -> error err
|
LFError err -> error err
|
||||||
LFBind -> LFBind
|
|
||||||
LFPre pts df -> LFPre pts' df'
|
LFPre pts df -> LFPre pts' df'
|
||||||
where
|
where
|
||||||
pts' = [ (strs, eval cxt t) | (strs,t) <- pts]
|
pts' = [ (strs, eval cxt t) | (strs,t) <- pts]
|
||||||
df' = eval cxt df
|
df' = eval cxt df
|
||||||
|
|
||||||
LFEmpty -> LFEmpty
|
|
||||||
LFToken tok -> LFToken tok
|
|
||||||
LFConcat s t -> LFConcat v w
|
LFConcat s t -> LFConcat v w
|
||||||
where
|
where
|
||||||
v = eval cxt s
|
v = eval cxt s
|
||||||
w = eval cxt t
|
w = eval cxt t
|
||||||
LFInt i -> LFInt i
|
|
||||||
LFTuple ts -> LFTuple vs
|
LFTuple ts -> LFTuple vs
|
||||||
where vs = map (eval cxt) ts
|
where vs = map (eval cxt) ts
|
||||||
LFProjection t u ->
|
LFProjection t u ->
|
||||||
@@ -148,12 +144,14 @@ eval cxt t = case t of
|
|||||||
(tp@(LFTuple _), LFTuple is) | all isInt is -> foldl (\(LFTuple vs) (LFInt i) -> vs !! (i-1)) tp is
|
(tp@(LFTuple _), LFTuple is) | all isInt is -> foldl (\(LFTuple vs) (LFInt i) -> vs !! (i-1)) tp is
|
||||||
(t',u') -> error $ printf "Incompatible projection:\n%s\n%s" (show t) (show u)
|
(t',u') -> error $ printf "Incompatible projection:\n%s\n%s" (show t) (show u)
|
||||||
LFArgument i -> cxt !! (i-1)
|
LFArgument i -> cxt !! (i-1)
|
||||||
|
_ -> t
|
||||||
|
|
||||||
-- | Turn concrete syntax terms into an actual string
|
-- | Turn concrete syntax terms into an actual string
|
||||||
lin2string :: LinFun -> String
|
lin2string :: LinFun -> String
|
||||||
lin2string l = case l of
|
lin2string l = case l of
|
||||||
LFEmpty -> ""
|
LFEmpty -> ""
|
||||||
LFBind -> "" -- when encountered at beginning/end
|
LFBind -> "" -- when encountered at beginning/end
|
||||||
|
LFSpace -> "" -- when encountered at beginning/end
|
||||||
LFToken tok -> tok
|
LFToken tok -> tok
|
||||||
LFTuple [l] -> lin2string l
|
LFTuple [l] -> lin2string l
|
||||||
LFConcat (LFPre pts df) l2 -> lin2string $ LFConcat l1 l2
|
LFConcat (LFPre pts df) l2 -> lin2string $ LFConcat l1 l2
|
||||||
@@ -162,6 +160,7 @@ lin2string l = case l of
|
|||||||
matches = [ l | (pfxs, l) <- pts, any (`isPrefixOf` l2') pfxs ]
|
matches = [ l | (pfxs, l) <- pts, any (`isPrefixOf` l2') pfxs ]
|
||||||
l1 = if null matches then df else head matches
|
l1 = if null matches then df else head matches
|
||||||
LFConcat l1 (LFConcat LFBind l2) -> lin2string l1 ++ lin2string l2
|
LFConcat l1 (LFConcat LFBind l2) -> lin2string l1 ++ lin2string l2
|
||||||
|
LFConcat l1 (LFConcat LFSpace l2) -> lin2string $ LFConcat l1 l2
|
||||||
LFConcat l1 l2 -> unwords $ filter (not.null) [lin2string l1, lin2string l2]
|
LFConcat l1 l2 -> unwords $ filter (not.null) [lin2string l1, lin2string l2]
|
||||||
x -> printf "[%s]" (show x)
|
x -> printf "[%s]" (show x)
|
||||||
|
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ abstract Bind = {
|
|||||||
concat : S -> S -> S ;
|
concat : S -> S -> S ;
|
||||||
bind : S -> S -> S ;
|
bind : S -> S -> S ;
|
||||||
softbind : S -> S -> S ;
|
softbind : S -> S -> S ;
|
||||||
|
softspace : S -> S -> S ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,3 +12,6 @@ BindCnc: hello theregoodbye
|
|||||||
|
|
||||||
Bind: softbind f1 f2
|
Bind: softbind f1 f2
|
||||||
BindCnc: hello theregoodbye
|
BindCnc: hello theregoodbye
|
||||||
|
|
||||||
|
Bind: softspace f1 f2
|
||||||
|
BindCnc: hello there goodbye
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ f2
|
|||||||
concat f1 f2
|
concat f1 f2
|
||||||
bind f1 f2
|
bind f1 f2
|
||||||
softbind f1 f2
|
softbind f1 f2
|
||||||
|
softspace f1 f2
|
||||||
|
|||||||
@@ -7,4 +7,5 @@ concrete BindCnc of Bind = open Prelude in {
|
|||||||
concat a b = ss (a.s ++ b.s) ;
|
concat a b = ss (a.s ++ b.s) ;
|
||||||
bind a b = ss (a.s ++ BIND ++ b.s) ;
|
bind a b = ss (a.s ++ BIND ++ b.s) ;
|
||||||
softbind a b = ss (a.s ++ SOFT_BIND ++ b.s) ;
|
softbind a b = ss (a.s ++ SOFT_BIND ++ b.s) ;
|
||||||
|
softspace a b = ss (a.s ++ SOFT_SPACE ++ b.s) ;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user