/**
* Stratego Bindings for parsing using SGLR.
*
* All parse functions fail if there is a parse error. The ATerm
* representation of the parse error can be retreived separately using
* get-parse-error.
*
* @author Martin Bravenboer
*/
module stratego/sglr/parse
imports
libstratego-lib
libstratego-xtc
/**
* Parse a string to an AST.
*
* @param ParseTable
* @param String or None
* @param String
* @type String -> AST
* @todo Set the pt type to asfix2?
*/
strategies
parse-string(|tbl) =
parse-string(id|tbl)
parse-string(|tbl, start-symbol) =
parse-string(id | tbl, start-symbol)
parse-string(|tbl, start-symbol, path) =
parse-string(id | tbl, start-symbol, path)
parse-string(on-parse-error | tbl) =
parse-string(on-parse-error | tbl, None(), "string")
parse-string(on-parse-error | tbl, start-symbol) =
parse-string(on-parse-error | tbl, start-symbol, "string")
parse-string(on-parse-error | tbl, start-symbol, path) =
parse-string-pt(on-parse-error | tbl, start-symbol, path)
; implode-asfix
/**
* Parse a string to a parse tree.
*
* @param ParseTable
* @param String or None
* @param String
* @type String -> ParseTree
*/
strategies
parse-string-pt(|tbl) =
parse-string-pt(id | tbl)
parse-string-pt(|tbl, start-symbol) =
parse-string-pt(id | tbl, start-symbol)
parse-string-pt(|tbl, start-symbol, path) =
parse-string-pt(id | tbl, start-symbol, path)
parse-string-pt(on-parse-error | tbl) =
parse-string-pt(on-parse-error | tbl, None(), "string")
parse-string-pt(on-parse-error | tbl, start-symbol) =
parse-string-pt(on-parse-error | tbl, start-symbol, "string")
parse-string-pt(on-parse-error |tbl, start-symbol, path) =
where(!tbl => ParseTable(internal-tbl))
; ?string
; prim("STRSGLR_parse_string_pt", on-parse-error | string, internal-tbl, start-symbol, path)
/**
* Parse a stream to an AST.
*
* @param ParseTable
* @param String or None
* @param String
* @type Stream -> AST
* @todo Set the pt type to asfix2?
*/
strategies
parse-stream(|tbl) =
parse-stream(fail | tbl)
parse-stream(|tbl, start-symbol) =
parse-stream(fail | tbl, start-symbol)
parse-stream(|tbl, start-symbol, path) =
parse-stream(fail | tbl, start-symbol, path)
parse-stream(on-parse-error |tbl) =
parse-stream(on-parse-error | tbl, None(), "string")
parse-stream(on-parse-error | tbl, start-symbol) =
parse-stream(on-parse-error | tbl, start-symbol, "string")
parse-stream(on-parse-error | tbl, start-symbol, path) =
parse-stream-pt(on-parse-error | tbl, start-symbol, path)
; implode-asfix
/**
* Parse a stream to a parse tree.
*
* @param ParseTable
* @param String or None
* @param String
* @type Stream -> ParseTree
*/
strategies
parse-stream-pt(| tbl) =
parse-stream-pt(id | tbl)
parse-stream-pt(| tbl, start-symbol) =
parse-stream-pt(id | tbl, start-symbol)
parse-stream-pt(| tbl, start-symbol, path) =
parse-stream-pt(id | tbl, start-symbol, path)
parse-stream-pt(on-parse-error | tbl) =
parse-stream-pt(on-parse-error | tbl, None(), "stream")
parse-stream-pt(on-parse-error | tbl, start-symbol) =
parse-stream-pt(on-parse-error | tbl, start-symbol, "stream")
parse-stream-pt(on-parse-error | tbl, start-symbol, path) =
where(!tbl => ParseTable(internal-tbl))
; ?Stream(stream)
; prim("STRSGLR_parse_stream_pt", on-parse-error | stream, internal-tbl, start-symbol, path)
/**
* Parse a file to an AST.
*
* @param ParseTable
* @param String or None
* @param String
* @type String -> AST
* @todo Set the pt type to asfix2?
*/
strategies
parse-file(|tbl) =
parse-file(fail, fail | tbl)
parse-file(|tbl, start-symbol) =
parse-file(fail, fail | tbl, start-symbol)
parse-file(|tbl, start-symbol, path) =
parse-file(fail, fail | tbl, start-symbol, path)
parse-file(on-open-error, on-parse-error | tbl) =
?path; parse-file(on-open-error, on-parse-error | tbl, None(), path)
parse-file(on-open-error, on-parse-error | tbl, start-symbol) =
?path; parse-file(on-open-error, on-parse-error | tbl, start-symbol, path)
parse-file(on-open-error, on-parse-error | tbl, start-symbol, path) =
parse-file-pt(on-open-error, on-parse-error | tbl, start-symbol, path)
; implode-asfix
/**
* Parse a file to a parse tree.
*
* @param ParseTable
* @param String or None
* @param String
* @type String -> ParseTree
*/
strategies
parse-file-pt(|tbl) =
parse-file-pt(fail, fail | tbl)
parse-file-pt(|tbl, start-symbol) =
parse-file-pt(fail, fail | tbl, start-symbol)
parse-file-pt(|tbl, start-symbol, path) =
parse-file-pt(fail, fail | tbl, start-symbol, path)
parse-file-pt(on-open-error, on-parse-error | tbl) =
?path; parse-file-pt(on-open-error, on-parse-error | tbl, None(), path)
parse-file-pt(on-open-error, on-parse-error | tbl, start-symbol) =
?path; parse-file-pt(on-open-error, on-parse-error | tbl, start-symbol, path)
parse-file-pt(on-open-error, on-parse-error | tbl, start-symbol, path) =
where(!tbl => ParseTable(internal-tbl))
; (<fopen> (<id>, "r") => stream <+ on-open-error; fail)
; finally(
parse-stream-pt(on-parse-error | tbl, start-symbol, path)
, <fclose> stream
)
/**
* Parse an XTC file to an AST.
*
* @param ParseTable
* @param String or None
* @param String
* @type FILE -> AST
* @todo Set the pt type to asfix2?
*/
strategies
/**
* @type FILE -> AST
*/
parse-xtc-file(|tbl) =
parse-xtc-file(fail, fail | tbl)
parse-xtc-file(|tbl, start-symbol) =
parse-xtc-file(fail, fail | tbl, start-symbol)
parse-xtc-file(|tbl, start-symbol, path) =
parse-xtc-file(fail, fail | tbl, start-symbol, path)
parse-xtc-file(on-open-error, on-parse-error | tbl) =
?file; parse-xtc-file(on-open-error, on-parse-error | tbl, None(), <path-of-xtc-file> file)
parse-xtc-file(on-open-error, on-parse-error | tbl, start-symbol) =
?file; parse-xtc-file(on-open-error, on-parse-error | tbl, start-symbol, <path-of-xtc-file> file)
parse-xtc-file(on-open-error, on-parse-error | tbl, start-symbol, path) =
parse-xtc-file-pt(on-open-error, on-parse-error | tbl, start-symbol, path)
; implode-asfix
/**
* Parse an XTC file to a parse tree.
*
* @param ParseTable
* @param String or None
* @param String
* @type FILE -> ParseTree
*/
strategies
parse-xtc-file-pt(|tbl) =
?file; parse-xtc-file-pt(fail, fail | tbl, None(), <path-of-xtc-file> file)
parse-xtc-file-pt(|tbl, start-symbol) =
?file; parse-xtc-file-pt(fail, fail | tbl, start-symbol, <path-of-xtc-file> file)
parse-xtc-file-pt(|tbl, start-symbol, path) =
parse-xtc-file-pt(fail, fail |tbl, start-symbol, path)
parse-xtc-file-pt(on-open-error, on-parse-error | tbl) =
?file; parse-xtc-file-pt(on-open-error, on-parse-error |tbl, None(), <path-of-xtc-file> file)
parse-xtc-file-pt(on-open-error, on-parse-error |tbl, start-symbol) =
?file; parse-xtc-file-pt(on-open-error, on-parse-error |tbl, start-symbol, <path-of-xtc-file> file)
parse-xtc-file-pt(on-open-error, on-parse-error |tbl, start-symbol, path) =
where(!tbl => ParseTable(internal-tbl))
; let open-stream =
?FILE(<id>); (<fopen> (<id>, "r") <+ on-open-error)
<+ ?stdin(); stdin-stream
in open-stream => stream
; finally(
parse-stream-pt(on-parse-error |tbl, start-symbol, path)
, <fclose> stream
)
end
path-of-xtc-file =
?FILE(<is-string>) + ?stdin(); !"stdin"
strategies
/**
* Returns the parser error from the last parse.
*
* Fails if the last parse did not fail.
*/
get-parse-error =
prim("STRSGLR_get_parse_error")
/**
* Clears the current parse error.
*
* The current parse error is cleared when parsing a new input, so
* there is usually no reason to invoke this strategy.
*/
clear-parse-error =
prim("STRSGLR_clear_parse_error")
/**
* Succeeds if the current term is a parse tree.
*/
is-parse-tree =
?t; prim("STRSGLR_is_parse_tree", t)