/** * Stratego Bindings for opening and closing parse tables. * * @author Martin Bravenboer */ module stratego/sglr/parse-table imports libstratego-lib strategies /** * Open a parse table for use in parsing. * * @type SerializedParseTable -> ParseTable */ open-parse-table = ?tbl ; prim("STRSGLR_open_parse_table", tbl) => internal ; !ParseTable(internal) /** * Close an open parse table. * This releases the memory that the open parse table occupies. * * @type ParseTable -> () */ close-parse-table = ?ParseTable(internal) ; prim("STRSGLR_close_parse_table", internal) ; !() /** * Succeeds if the table argument is open. */ is-parse-table-open(|tbl) = where(!tbl => ParseTable(_)) /** * Opening parse table with error reporting. */ strategies open-parse-table-wrap-report-errors(s : OpenParseTable * a -> b | tbl) = where(tbl' := <open-parse-table-report-errors> tbl) ; finally(s(|tbl'), <close-parse-table> tbl') /** * @type String or SerializedParseTable -> ParseTable */ open-parse-table-report-errors = if is-string then (<fopen> (<id>, "r") <+ strsglr-perror) => stream ; finally(read-from-stream, <fclose> stream) else ?"parse-table"#(_) <+ log(|Error(), "open-parse-table strategy applied to a non-parse-table") ; fail end ; open-parse-table /** * An open parse table is represented by a term in some internal * format, wrapped in a ParseTable constructor. */ signature constructors ParseTable : Internal -> ParseTable