]> Joshua Wise's Git repositories - snipe.git/blob - parse/parsestate.sml
Initial import of l3c
[snipe.git] / parse / parsestate.sml
1 (* L3 Compiler
2  * Parse State System
3  * Author: Kaustuv Chaudhuri <kaustuv+@cs.cmu.edu>
4  * Annotations: Alex Vaynberg <alv@andrew.cmu.edu>
5  * Modified: Frank Pfenning <fp@cs.cmu.edu>
6  *
7  * This tracks filename and newline characters
8  * so character positions in lexer tokens
9  * can be converted to line.column format for error messages
10  *)
11
12 signature PARSE_STATE =
13   sig
14     (* setfile(filename) sets current filename and resets newline positions *) 
15     val setfile : string -> unit
16
17     (* newline(pos) adds pos to current newline positions *)
18     val newline : int -> unit
19
20     (* returns the current position information based on two integer offsets *)
21     val ext : int * int -> Mark.ext option
22   end
23
24 structure ParseState :> PARSE_STATE =
25 struct
26
27   val currFilename = ref "";
28   val currLines = ref (nil : int list);
29
30   fun setfile (filename) =
31       (currFilename := filename;
32        currLines := nil)
33
34   fun newline pos =
35       (currLines := pos :: !currLines)
36
37   (* look (pos, newline_positions, line_number) = (line, col)
38    * pos is buffer position
39    * newline_positions is (reverse) list of newline positions in file
40    * line_number is lenght of newline_positions
41    *)
42   fun look (pos, a :: rest, n) =
43       (* a is end of line n *)
44       if a < pos then (n+1, pos-a)
45       else look (pos, rest, n-1) 
46     | look (pos, nil, n) = 
47       (* first line pos is off by 1 *)
48       (1, pos-1)
49
50   (* ext (leftpos, rightpos) = SOME((leftline, leftcol), (rightline, rightcol), filename)
51    * return NONE for invalid position (0,0)
52    *)
53   fun ext (0, 0) = NONE
54     | ext (left, right) =
55       SOME (look (left, !currLines, List.length (!currLines)),
56             look (right, !currLines, List.length (!currLines)),
57             !currFilename)
58
59 end
This page took 0.027351 seconds and 4 git commands to generate.