src/HOL/TPTP/TPTP_Parser/tptp_parser.ML
author wenzelm
Sat, 07 Apr 2012 16:41:59 +0200
changeset 47389 e8552cba702d
parent 46844 5d9aab0c609c
child 60982 67e389f67073
permissions -rw-r--r--
explicit checks stable_finished_theory/stable_command allow parallel asynchronous command transactions; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     1
(*  Title:      HOL/TPTP/TPTP_Parser/tptp_parser.ML
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     2
    Author:     Nik Sultana, Cambridge University Computer Laboratory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     3
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     4
An interface for a parser, generated using ML-Yacc, to parse TPTP languages.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     5
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     6
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     7
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     8
(* Build the parser structure *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     9
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    10
structure TPTPLrVals = TPTPLrValsFun(structure Token = LrParser.Token)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    11
structure TPTPLex = TPTPLexFun(structure Tokens = TPTPLrVals.Tokens)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    12
structure TPTPParser
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    13
  = JoinWithArg
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    14
     (structure ParserData = TPTPLrVals.ParserData
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    15
      structure Lex = TPTPLex
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    16
      structure LrParser = LrParser)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    17
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    18
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    19
(* Parser interface *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    20
structure TPTP_Parser :
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    21
sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    22
  val parse_file : string -> TPTP_Syntax.tptp_problem
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    23
  val parse_expression : string -> string -> TPTP_Syntax.tptp_problem
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    24
  exception TPTP_PARSE_ERROR
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    25
end =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    26
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    27
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    28
exception TPTP_PARSE_ERROR
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    29
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    30
val LOOKAHEAD = 0 (*usually set to 15*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    31
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    32
local
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    33
  fun print_error file_name (msg, line, col) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    34
    error (file_name ^ "[" ^ Int.toString line ^ ":" ^ Int.toString col ^ "] " ^
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    35
      msg ^ "\n")
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    36
  fun parse lookahead grab file_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    37
    TPTPParser.parse
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    38
      (lookahead,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    39
       TPTPParser.makeLexer grab file_name,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    40
       print_error file_name,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    41
       file_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    42
in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    43
  fun parse_expression file_name expression =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    44
    (*file_name only used in reporting error messages*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    45
    let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    46
      val currentPos = Unsynchronized.ref 0
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    47
      fun grab n =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    48
        if !currentPos = String.size expression then ""
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    49
        else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    50
          let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    51
            fun extractStr n =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    52
              let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    53
                val s = String.extract (expression, !currentPos, SOME n)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    54
              in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    55
                currentPos := !currentPos + n;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    56
                s
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    57
              end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    58
            val remaining = String.size expression - !currentPos
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    59
          in if remaining < n then extractStr remaining else extractStr n
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    60
          end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    61
      val (tree, _ (*remainder*)) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    62
        parse LOOKAHEAD grab file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    63
    in tree end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    64
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    65
  fun parse_file' lookahead file_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    66
    parse_expression
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    67
     file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    68
     (File.open_input TextIO.inputAll (Path.explode file_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    69
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    70
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    71
val parse_file = parse_file' LOOKAHEAD
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    72
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    73
end