module generate imports libstratego-gpp signatures/- pp/IBAF-parenthesize pp/IBAF-pp pp/Funcons-pp-pp cbs-gen/IBAF-Start rules // Builder // Generates a funcon term for selected AST. generate-fct: (selected, position, ast, path, project-path) -> (filename, result) where path with filename := path; funcons := selected; result := funcons generate-fct: (selected, position, ast, path, project-path) -> None() where path prettyprint-IBAF-string = parenthesize-IBAF ; prettyprint-IBAF-Start ; !V([], ) ; box2text-string(|80) to-funcons-start: START -> |[ start[: START :] ]| to-funcons-top = to-funcons-start; innermost(to-desugared <+ to-funcons <+ to-funcons-default); bottomup(try(to-funcons-lex)); innermost(to-funcons-sequences <+ to-funcons-groups); innermost(to-funcons-apps) to-funcons = fail to-funcons-default = fail to-desugared = fail // Funcons involved in simplification rules: rules to-funcons-sequences: FCTSequence(FCTEmpty(),seq) -> seq to-funcons-sequences: FCTSequence(seq,FCTEmpty()) -> seq to-funcons-sequences: FCTApp("sequential",FCTGroup(FCTSequence(fct,FCTApp("sequential",FCTGroup(seq))))) -> FCTApp("sequential",FCTGroup(FCTSequence(fct,seq))) to-funcons-groups: FCTGroup(FCTGroup(seq)) -> FCTGroup(seq) to-funcons-apps: FCTApp(f1,FCTApp(f2,fct)) -> FCTAppComp([f1,f2],fct) to-funcons-apps: FCTApp(f,FCTAppComp(fs,fct)) -> FCTAppComp([f|fs],fct) to-funcons-apps: FCTApp(f,FCTGroup(seq)) -> FCTAppComp([f],FCTGroup(seq)) rules to-funcons-lex: FCTString(str) -> FCTString( str) to-funcons-lex = ?FCTInt(_) to-funcons-lex = ?FCTChar(_) to-funcons-lex: FCTApp("integer-add",FCTGroup(FCTSequence(FCTInt(s),FCTInt(t)))) -> FCTInt(( s, t)) to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTString(str2)))) -> FCTString( [ str1, str2]) to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTSequence(FCTString(str2),FCTString(str3))))) -> FCTString( [ str1, str2, str3]) // generalise to nested sequences to-funcons-lex: FCTList(seq) -> FCTString( l) where seq; l := (seq, []) // l accumulates a list of strings, initially []: to-funcons-string-list: (FCTSequence(seq1, seq2), l) -> (seq1, (seq2, l)) to-funcons-string-list: (FCTEmpty(), l) -> l // 'C': to-funcons-string-list: (FCTString(str), l) -> [str | l] // ascii-character("C"): to-funcons-string-list: (FCTApp("ascii-character", FCTGroup(FCTString(str))), l) -> [str | l] // ascii-character("\C"): to-funcons-string-list: (FCTApp("ascii-character", FCTApp("list-to-string", FCTList(seq))), l) -> (seq, l)