Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /smlnj-lib/branches/rt-transition/HTML/html-lex
ViewVC logotype

Annotation of /smlnj-lib/branches/rt-transition/HTML/html-lex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2980 - (view) (download)

1 : monnier 2 (* html-lex
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     * COPYRIGHT (c) 1996 AT&T Research.
5 :     *
6 :     * A scanner for HTML.
7 :     *
8 :     * TODO:
9 :     * Recognize the DOCTYPE element
10 :     * <!DOCTYPE HTML PUBLIC "...">
11 :     * Clean-up the scanning of start tags (do we need Err?).
12 :     * Whitespace in PRE elements should be preserved, but how?
13 :     *)
14 :    
15 :     structure T = Tokens
16 :     structure Elems = HTMLElementsFn (
17 :     structure Tokens = Tokens
18 :     structure Err = Err
19 :     structure HTMLAttrs = HTMLAttrs)
20 :    
21 :     type pos = int
22 :     type svalue = T.svalue
23 :     type arg = (((string * int * int) -> unit) * string option)
24 :     type ('a, 'b) token = ('a, 'b) T.token
25 :     type lexresult= (svalue, pos) token
26 :    
27 :     fun eof _ = Tokens.EOF(0, 0)
28 :    
29 :     (* a buffer for collecting a string piecewise *)
30 :     val buffer = ref ([] : string list)
31 :     fun addStr s = (buffer := s :: !buffer)
32 :     fun getStr () = (String.concat(List.rev(! buffer)) before (buffer := []))
33 :    
34 :     %%
35 :    
36 :     %s COM1 COM2 STAG;
37 :    
38 :     %header (functor HTMLLexFn (
39 :     structure Tokens : HTML_TOKENS
40 :     structure Err : HTML_ERROR
41 :     structure HTMLAttrs : HTML_ATTRS));
42 :    
43 :     %arg (errorFn, file);
44 :    
45 :     %full
46 :     %count
47 :    
48 :     alpha=[A-Za-z];
49 :     digit=[0-9];
50 :     namechar=[-A-Za-z0-9.];
51 :     tag=({alpha}{namechar}*);
52 :     ws = [\ \t];
53 :    
54 :     %%
55 :    
56 :     <INITIAL>"<"{tag}
57 :     => (addStr yytext; YYBEGIN STAG; continue());
58 :     <STAG>">"
59 :     => (addStr yytext;
60 :     YYBEGIN INITIAL;
61 :     case Elems.startTag file (getStr(), !yylineno, !yylineno)
62 :     of NONE => continue()
63 :     | (SOME tag) => tag
64 :     (* end case *));
65 :     <STAG>\n
66 :     => (addStr " "; continue());
67 :     <STAG>{ws}+
68 :     => (addStr yytext; continue());
69 :     <STAG>{namechar}+
70 :     => (addStr yytext; continue());
71 :     <STAG>"="
72 :     => (addStr yytext; continue());
73 :     <STAG>"\""[^\"\n]*"\""
74 :     => (addStr yytext; continue());
75 :     <STAG>"'"[^'\n]*"'"
76 :     => (addStr yytext; continue());
77 :     <STAG>.
78 :     => (addStr yytext; continue());
79 :    
80 :     <INITIAL>"</"{tag}{ws}*">"
81 :     => (case Elems.endTag file (yytext, !yylineno, !yylineno)
82 :     of NONE => continue()
83 :     | (SOME tag) => tag
84 :     (* end case *));
85 :    
86 :     <INITIAL>"<!--"
87 :     => (YYBEGIN COM1; continue());
88 :     <COM1>"--"
89 :     => (YYBEGIN COM2; continue());
90 :     <COM1>\n
91 :     => (continue());
92 :     <COM1>.
93 :     => (continue());
94 :     <COM2>"--"
95 :     => (YYBEGIN COM1; continue());
96 :     <COM2>">"
97 :     => (YYBEGIN INITIAL; continue());
98 :     <COM2>\n
99 :     => (continue());
100 :     <COM2>{ws}
101 :     => (continue());
102 :     <COM2>.
103 :     => (errorFn("bad comment syntax", !yylineno, !yylineno+1);
104 :     YYBEGIN INITIAL;
105 :     continue());
106 :    
107 :     <INITIAL>"&#"[A-Za-z]+";"
108 :     => (
109 :     (** At some point, we should support &#SPACE; and &#TAB; **)
110 :     continue());
111 :    
112 :     <INITIAL>"&#"[0-9]+";"
113 :     => (T.CHAR_REF(yytext, !yylineno, !yylineno));
114 :    
115 :     <INITIAL>"&"{tag}";"
116 :     => (T.ENTITY_REF(yytext, !yylineno, !yylineno));
117 :    
118 :     <INITIAL>"\n"
119 :     => (continue());
120 :     <INITIAL>{ws}
121 :     => (continue());
122 :    
123 :     <INITIAL>[^<]+
124 :     => (T.PCDATA(yytext, !yylineno, !yylineno));
125 :     <INITIAL>.
126 :     => (errorFn(concat[
127 :     "bogus character #\"", Char.toString(String.sub(yytext, 0)),
128 :     "\" in PCDATA\n"
129 :     ], !yylineno, !yylineno+1);
130 :     continue());
131 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0