15 structure SimpleSyntax: SIMPLE_SYNTAX = |
15 structure SimpleSyntax: SIMPLE_SYNTAX = |
16 struct |
16 struct |
17 |
17 |
18 (* scanning tokens *) |
18 (* scanning tokens *) |
19 |
19 |
20 local |
|
21 |
|
22 val eof = Lexicon.EndToken; |
|
23 fun is_eof tk = tk = Lexicon.EndToken; |
|
24 |
|
25 val stopper = Scan.stopper (K eof) is_eof; |
|
26 val not_eof = not o is_eof; |
|
27 |
|
28 val lexicon = Scan.make_lexicon |
20 val lexicon = Scan.make_lexicon |
29 (map Symbol.explode ["!!", "%", "(", ")", ".", "::", "==", "==>", "=?=", "=>", "&&", "CONST"]); |
21 (map Symbol.explode ["!!", "%", "(", ")", ".", "::", "==", "==>", "=?=", "=>", "&&", "CONST"]); |
30 |
|
31 in |
|
32 |
22 |
33 fun read scan s = |
23 fun read scan s = |
34 (case |
24 (case |
35 SymbolPos.explode (s, Position.none) |> |
25 SymbolPos.explode (s, Position.none) |> |
36 Lexicon.tokenize lexicon false |> |
26 Lexicon.tokenize lexicon false |> |
37 Scan.read stopper scan of |
27 Scan.read Lexicon.stopper scan of |
38 SOME x => x |
28 SOME x => x |
39 | NONE => error ("Malformed input: " ^ quote s)); |
29 | NONE => error ("Malformed input: " ^ quote s)); |
40 |
|
41 end; |
|
42 |
30 |
43 |
31 |
44 (* basic scanners *) |
32 (* basic scanners *) |
45 |
33 |
46 fun $$ s = Scan.some (fn Lexicon.Token s' => if s = s' then SOME s else NONE | _ => NONE); |
34 fun $$ s = Scan.some (fn Lexicon.Token (Lexicon.Literal, s', _) => |
|
35 if s = s' then SOME s else NONE | _ => NONE); |
|
36 |
47 fun enum1 s scan = scan ::: Scan.repeat ($$ s |-- scan); |
37 fun enum1 s scan = scan ::: Scan.repeat ($$ s |-- scan); |
48 fun enum2 s scan = scan ::: Scan.repeat1 ($$ s |-- scan); |
38 fun enum2 s scan = scan ::: Scan.repeat1 ($$ s |-- scan); |
49 |
39 |
50 val tfree = Scan.some (fn Lexicon.TFreeSy s => SOME s | _ => NONE); |
40 val tfree = Scan.some (fn Lexicon.Token (Lexicon.TFreeSy, s, _) => SOME s | _ => NONE); |
51 val ident = Scan.some (fn Lexicon.IdentSy s => SOME s | _ => NONE); |
41 val ident = Scan.some (fn Lexicon.Token (Lexicon.IdentSy, s, _) => SOME s | _ => NONE); |
52 val var = |
42 |
53 Scan.some (fn Lexicon.VarSy s => SOME (Lexicon.read_indexname (unprefix "?" s)) | _ => NONE); |
43 val var = Scan.some (fn Lexicon.Token (Lexicon.VarSy, s, _) => |
54 val long_ident = Scan.some (fn Lexicon.LongIdentSy s => SOME s | _ => NONE); |
44 SOME (Lexicon.read_indexname (unprefix "?" s)) | _ => NONE); |
|
45 |
|
46 val long_ident = Scan.some (fn Lexicon.Token (Lexicon.LongIdentSy, s, _) => SOME s | _ => NONE); |
55 val const = long_ident || ident; |
47 val const = long_ident || ident; |
56 |
48 |
57 |
49 |
58 (* types *) |
50 (* types *) |
59 |
51 |