module stratego/rtg/parse
imports
  libstratego-sglr

strategies

  /**
   * Parse an RTG from a file.
   *
   * @type String -> RTG
   */
  parse-rtg-file =
    where(tbl := <get-rtg-parse-table>)
    ; parse-file(strsglr-perror, strsglr-report-parse-error | <get-rtg-parse-table>)
    ; rtg-parsefix

  parse-rtg-stream =
    where(tbl := <get-rtg-parse-table>)
    ; parse-stream(strsglr-report-parse-error | <get-rtg-parse-table>)
    ; rtg-parsefix

  get-rtg-parse-table =
    MemoRTGParseTable
    <+ import-term(rtg.tbl)
       ; open-parse-table
       ; ?tbl
       ; rules(MemoRTGParseTable: _ -> tbl)

  external STRRTG-get-rtg-parsetable(|)

strategies

  /**
   * @type  RTG -> RTG
   */
  rtg-parsefix =
    topdown(try(rtg-ParseFix))

  rtg-ParseFix :
    Plain(s) -> s

  rtg-ParseFix :
    Quoted(parts) ->
      < map(?Chars(<id>) + ?EscapeSeq(<<implode-string> [<id>]>))
      ; concat-strings
      > parts

  rtg-ParseFix =
    TupleTerm(string-to-int)