TSG prog def 1 defn 1n def DEFINEfname

  • Slides: 21
Download presentation

Синтаксис TSG-программ « prog : : = [def 1, . . . defn] 1≤n

Синтаксис TSG-программ « prog : : = [def 1, . . . defn] 1≤n « def : : = (DEFINEfname [parm 1, . . . parmn] term) 0≤n « term : : = (ALT cond term 1 term 2 ) | (CALL fname [arg 1, . . . argn]) 0≤n | e-exp « cond : : = (EQA? a-exp 1 a-exp 2) | (CONS? e-exp e-var 1 e-var 2 a-var) « a-exp : : = a-val | a-var « e-exp : : = a-val | a-var | e-var | (CONSe-exp 1 e-exp 2) « parm : : = a-var | e-var « arg : : = a-exp | e-exp « a-var : : = (PVA name) « e-var : : = (PVE name)

Проверка вхождения одной строки в другую « match = [ (DEFINE "Match"[e. subs, e.

Проверка вхождения одной строки в другую « match = [ (DEFINE "Match"[e. subs, e. str] (CALL "Check. Pos"[e. subs, e. str, e. subs, e. str])), (DEFINE "Check. Pos"[e. subs, e. str, e. subs 1, e. str 1] (ALT (CONS’ e. subs-head e. subs-tail a. _) (ALT (CONS’ e. subs-head e. _ a. subs-head) ’FAILURE (ALT (CONS’ e. str-head e. str-tail a. _) (ALT (CONS’ e. str-head e. _ a. str-head) ’FAILURE (ALT (EQA’ a. subs-head a. str-head) (CALL "Check. Pos"[e. subs-tail, e. str-tail, e. subs 1, e. str 1]) (CALL "Next. Pos"[e. subs 1, e. str 1]))) ’FAILURE)) ’SUCCESS)), (DEFINE "Next. Pos"[e. subs, e. str] (ALT (CONS’ e. str e. _ e. str-tail a. _) (CALL "Match"[e. subs, e. str-tail]) ’FAILURE)) ]

Интерпретатор языка TSG (1/2) « int : : Prog. R -> [EVal] -> EVal

Интерпретатор языка TSG (1/2) « int : : Prog. R -> [EVal] -> EVal int p ds = eval s p where (DEFINE f prms _) : p' = p e = mk. Env prms sd s = ((CALL f prms), e) « eval : : State -> Prog. R -> EVal eval s@((CALL f args), e) p = eval s' p where DEFINE _ prms t' = get. Def f p e' = mk. Env prms (args/. e) s' = (t', e') eval s@((ALT c t 1 t 2), e) p = case cond c e of TRUE ue -> eval (t 1, e+. ue) p FALSE ue -> eval (t 2, e+. ue) p eval s@(exp, e) p = exp/. e

Интерпретатор языка TSG (2/2) (функция cond) « data Cond. Res = TRUE Env |

Интерпретатор языка TSG (2/2) (функция cond) « data Cond. Res = TRUE Env | FALSE Env « cond : : Cond -> Env -> Cond. Res cond (EQA? x y) e = let x' = x/. e; y' = y/. e in case (x', y') of (ATOM a, ATOM b) | a==b -> TRUE [ ] (ATOM a, ATOM b) -> FALSE[ ] cond (CONS? x vh vt va) e = let x' = x/. e in case x' of CONS h t ->TRUE [vh: =h, vt: =t] ATOM a ->FALSE[va: =x']