scanner works
This commit is contained in:
parent
f9b24ef221
commit
5836cbe2f4
4 changed files with 102 additions and 0 deletions
|
|
@ -0,0 +1,20 @@
|
|||
signature SCANNER =
|
||||
sig
|
||||
datatype token =
|
||||
LPAREN
|
||||
| RPAREN
|
||||
| AND
|
||||
| OR
|
||||
| EQ
|
||||
| RARROW
|
||||
| LRARROW
|
||||
| DOT
|
||||
| COMMA
|
||||
| FORALL
|
||||
| EXISTS
|
||||
| IDENT of string
|
||||
| ERR
|
||||
|
||||
val scan: {srcname: string, input: string} -> (token * Region.reg) list
|
||||
val pp_token: token -> string
|
||||
end
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
structure Scanner: SCANNER =
|
||||
struct
|
||||
open SimpleToken
|
||||
|
||||
datatype token =
|
||||
LPAREN
|
||||
| RPAREN
|
||||
| AND
|
||||
| OR
|
||||
| EQ
|
||||
| RARROW
|
||||
| LRARROW
|
||||
| DOT
|
||||
| COMMA
|
||||
| FORALL
|
||||
| EXISTS
|
||||
| IDENT of string
|
||||
| ERR
|
||||
|
||||
fun map_token (Symb "(") = LPAREN
|
||||
| map_token (Symb ")") = RPAREN
|
||||
| map_token (Symb ".") = DOT
|
||||
| map_token (Symb ",") = COMMA
|
||||
| map_token (Symb "&") = AND
|
||||
| map_token (Symb "|") = OR
|
||||
| map_token (Symb "=") = EQ
|
||||
| map_token (Symb "=>") = RARROW
|
||||
| map_token (Symb "<=>") = LRARROW
|
||||
| map_token (Symb _) = ERR
|
||||
| map_token (Id "forall") = FORALL
|
||||
| map_token (Id "exists") = EXISTS
|
||||
| map_token (Id id) = IDENT id
|
||||
| map_token (Num _) = ERR
|
||||
|
||||
fun const k _ = k
|
||||
|
||||
val scan =
|
||||
map (fn (t, r) => (map_token t, r))
|
||||
o
|
||||
tokenise
|
||||
{ sep_chars = "(),&|."
|
||||
, symb_chars = "<=>"
|
||||
, is_id = (List.all Char.isAlphaNum) o String.explode
|
||||
, is_num = const false
|
||||
}
|
||||
|
||||
val pp_token =
|
||||
fn LPAREN => "("
|
||||
| RPAREN => ")"
|
||||
| AND => "&"
|
||||
| OR => "|"
|
||||
| EQ => "="
|
||||
| RARROW => "=>"
|
||||
| LRARROW => "<=>"
|
||||
| DOT => "."
|
||||
| COMMA => ","
|
||||
| FORALL => "forall"
|
||||
| EXISTS => "exists"
|
||||
| ERR => "unk"
|
||||
| IDENT s => s
|
||||
end
|
||||
|
|
@ -1,3 +1,8 @@
|
|||
$(SML_LIB)/basis/basis.mlb
|
||||
../kernel/kernel.mlb
|
||||
../../../../github.com/diku-dk/sml-parse/parse.mlb
|
||||
../../../../github.com/diku-dk/sml-parse/simple_token.mlb
|
||||
SCANNER.sig
|
||||
Scanner.sml
|
||||
|
||||
repl.sml
|
||||
|
|
|
|||
16
lib/forgejo.ballcloud.cc/wball/proof-checker/parser/repl.sml
Normal file
16
lib/forgejo.ballcloud.cc/wball/proof-checker/parser/repl.sml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
open Scanner
|
||||
|
||||
fun scan_repl s = scan {srcname = "repl", input = s}
|
||||
|
||||
fun report_scan s = print ((String.concatWith ", " (map (pp_token o #1) (scan_repl s))) ^ "\n")
|
||||
|
||||
fun repl () =
|
||||
( print "> "
|
||||
; case (TextIO.inputLine TextIO.stdIn) of
|
||||
SOME s => (report_scan s; repl ())
|
||||
| NONE => ()
|
||||
)
|
||||
|
||||
fun main () = repl ()
|
||||
|
||||
(* val () = main () *)
|
||||
Loading…
Reference in a new issue