23 val USES = "uses" |
23 val USES = "uses" |
24 val BEGIN = "begin" |
24 val BEGIN = "begin" |
25 |
25 |
26 val lexicon = Scan.Lexicon("%", "(", ")", ";", BEGIN, HEADER, IMPORTS, THEORY, USES) |
26 val lexicon = Scan.Lexicon("%", "(", ")", ";", BEGIN, HEADER, IMPORTS, THEORY, USES) |
27 |
27 |
28 sealed case class Header(val name: String, val imports: List[String], val uses: List[String]) |
|
29 { |
|
30 def map(f: String => String): Header = |
|
31 Header(f(name), imports.map(f), uses.map(f)) |
|
32 } |
|
33 |
|
34 |
28 |
35 /* file name */ |
29 /* file name */ |
36 |
30 |
37 def thy_path(name: String): Path = Path.basic(name).ext("thy") |
31 def thy_path(name: String): Path = Path.basic(name).ext("thy") |
38 |
32 |
55 |
49 |
56 val uses = opt(keyword(USES) ~! (rep1(file))) ^^ { case None => Nil case Some(_ ~ xs) => xs } |
50 val uses = opt(keyword(USES) ~! (rep1(file))) ^^ { case None => Nil case Some(_ ~ xs) => xs } |
57 |
51 |
58 val args = |
52 val args = |
59 theory_name ~ (keyword(IMPORTS) ~! (rep1(theory_name) ~ uses ~ keyword(BEGIN))) ^^ |
53 theory_name ~ (keyword(IMPORTS) ~! (rep1(theory_name) ~ uses ~ keyword(BEGIN))) ^^ |
60 { case x ~ (_ ~ (ys ~ zs ~ _)) => Header(x, ys, zs) } |
54 { case x ~ (_ ~ (ys ~ zs ~ _)) => Thy_Header(x, ys, zs) } |
61 |
55 |
62 (keyword(HEADER) ~ tags) ~! |
56 (keyword(HEADER) ~ tags) ~! |
63 ((doc_source ~ rep(keyword(";")) ~ keyword(THEORY) ~ tags) ~> args) ^^ { case _ ~ x => x } | |
57 ((doc_source ~ rep(keyword(";")) ~ keyword(THEORY) ~ tags) ~> args) ^^ { case _ ~ x => x } | |
64 (keyword(THEORY) ~ tags) ~! args ^^ { case _ ~ x => x } |
58 (keyword(THEORY) ~ tags) ~! args ^^ { case _ ~ x => x } |
65 } |
59 } |
66 |
60 |
67 |
61 |
68 /* read -- lazy scanning */ |
62 /* read -- lazy scanning */ |
69 |
63 |
70 def read(reader: Reader[Char]): Header = |
64 def read(reader: Reader[Char]): Thy_Header = |
71 { |
65 { |
72 val token = lexicon.token(_ => false) |
66 val token = lexicon.token(_ => false) |
73 val toks = new mutable.ListBuffer[Token] |
67 val toks = new mutable.ListBuffer[Token] |
74 |
68 |
75 @tailrec def scan_to_begin(in: Reader[Char]) |
69 @tailrec def scan_to_begin(in: Reader[Char]) |
87 case Success(result, _) => result |
81 case Success(result, _) => result |
88 case bad => error(bad.toString) |
82 case bad => error(bad.toString) |
89 } |
83 } |
90 } |
84 } |
91 |
85 |
92 def read(source: CharSequence): Header = |
86 def read(source: CharSequence): Thy_Header = |
93 read(new CharSequenceReader(source)) |
87 read(new CharSequenceReader(source)) |
94 |
88 |
95 def read(file: File): Header = |
89 def read(file: File): Thy_Header = |
96 { |
90 { |
97 val reader = Scan.byte_reader(file) |
91 val reader = Scan.byte_reader(file) |
98 try { read(reader).map(Standard_System.decode_permissive_utf8) } |
92 try { read(reader).map(Standard_System.decode_permissive_utf8) } |
99 finally { reader.close } |
93 finally { reader.close } |
100 } |
94 } |
101 |
95 |
102 |
96 |
103 /* check */ |
97 /* check */ |
104 |
98 |
105 def check(name: String, source: CharSequence): Header = |
99 def check(name: String, source: CharSequence): Thy_Header = |
106 { |
100 { |
107 val header = read(source) |
101 val header = read(source) |
108 val name1 = header.name |
102 val name1 = header.name |
109 if (name != name1) error("Bad file name " + thy_path(name) + " for theory " + quote(name1)) |
103 if (name != name1) error("Bad file name " + thy_path(name) + " for theory " + quote(name1)) |
110 Path.explode(name) |
104 Path.explode(name) |
111 header |
105 header |
112 } |
106 } |
113 } |
107 } |
|
108 |
|
109 |
|
110 sealed case class Thy_Header(val name: String, val imports: List[String], val uses: List[String]) |
|
111 { |
|
112 def map(f: String => String): Thy_Header = |
|
113 Thy_Header(f(name), imports.map(f), uses.map(f)) |
|
114 } |
|
115 |