/** * @author Merijn de Jonge (mdjonge@cwi.nl) */ module stratego/gpp/PpTableIO /** * @todo Fix this import (signature must be in library) */ imports pp-table libstratego-sglr strategies /** * @type List(PpTable) -> HashTable */ pptable-make-hashtable = where(tbl := <new-hashtable>) ; map( ?PP-Table(<id>) ; reverse ; map(pptable-desugar-entry; pptable-store-entry(|tbl)) ) ; !tbl pptable-store-entry(|tbl) = ?entry@PP-Entry(path, value) ; <hashtable-put(|<pptable-make-key> entry, (path, value))> tbl /** * Pretty-printing of paths */ strategies /** * @type Path -> String */ pptable-path-to-string = ?Path1(<id>) /** * @type Path -> String */ pptable-path-to-string = ?Path( s1, s2 ) ; < map( \ selector(a,b) -> [".", <int-to-string>a,":", b] \ ) ; concat > s2 => s3 ; <concat-strings> [s1 | s3] /** * Key of a pp entry. */ strategies /** * @type PP-Entry -> Key */ pptable-make-key : PP-Entry(Path1(s), value) -> (arity, [s]) where <pptable-arity-of-template> value => arity pptable-make-key : PP-Entry(Path(s1, s2), value) -> <reverse> [s1 | xs] where <map(?selector(<id>, _))> s2 => xs /** * Determines the arity of a template by collecting the Arg nodes. * * @type BOX -> Int */ pptable-arity-of-template = collect(Arg(id)); length /** * Desguaring of pp entries */ strategies pptable-desugar-entry = topdown( try( Arg(string-to-int) + Arg2(string-to-int, string-to-int) + S(un-double-quote; unescape) + selector(string-to-int, id) ) ) /** * Access to the pp table */ strategies /** * Get an entry from the pp-table and log if the entry does not exist. */ pptable-get-log(|tbl) = ?key ; ( <hashtable-get(|key)> tbl <+ log(|Error(),<concat-strings>["No pp entry found for: ",<write-to-string> key]) ; fail)