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/HTML4/html4.g
ViewVC logotype

Annotation of /smlnj-lib/branches/rt-transition/HTML4/html4.g

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4071 - (view) (download)

1 : jhr 4071 (* html4.g
2 :     *
3 :     * COPYRIGHT (c) 2014 The Fellowship of SML/NJ (http://www.smlnj.org)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :     %name HTML4;
8 :    
9 :     %defs(
10 :    
11 :     open HTML4Utils
12 :    
13 :     fun optToList NONE = []
14 :     | optToList (SOME thing) = [thing]
15 :    
16 :     fun optListToList NONE = []
17 :     | optListToList (SOME thing) = thing
18 :    
19 :     );
20 :    
21 :     %tokens : OPENTAG of Atom.atom * HTML4Utils.tag_payload
22 :     | CLOSETAG of Atom.atom
23 :     | COMMENT of string
24 :     | PCDATA of string
25 :     | DOCTYPE of string
26 :     | CHAR_REF of IntInf.int
27 :     | ENTITY_REF of Atom.atom
28 :     | XML_PROCESSING of string
29 :     (* HTML 4 element tokens. *)
30 :     | STARTA of HTML4Utils.tag_payload
31 :     | ENDA
32 :     | STARTABBR of HTML4Utils.tag_payload
33 :     | ENDABBR
34 :     | STARTACRONYM of HTML4Utils.tag_payload
35 :     | ENDACRONYM
36 :     | STARTADDRESS of HTML4Utils.tag_payload
37 :     | ENDADDRESS
38 :     | STARTAPPLET of HTML4Utils.tag_payload
39 :     | ENDAPPLET
40 :     | STARTAREA of HTML4Utils.tag_payload
41 :     (* No END tag for AREA element. *)
42 :     | STARTB of HTML4Utils.tag_payload
43 :     | ENDB
44 :     | STARTBASE of HTML4Utils.tag_payload
45 :     (* No END tag for BASE element. *)
46 :     | STARTBASEFONT of HTML4Utils.tag_payload
47 :     (* No END tag for BASEFONT element. *)
48 :     | STARTBDO of HTML4Utils.tag_payload
49 :     | ENDBDO
50 :     | STARTBIG of HTML4Utils.tag_payload
51 :     | ENDBIG
52 :     | STARTBLOCKQUOTE of HTML4Utils.tag_payload
53 :     | ENDBLOCKQUOTE
54 :     | STARTBODY of HTML4Utils.tag_payload
55 :     | ENDBODY
56 :     | STARTBR of HTML4Utils.tag_payload
57 :     (* No END tag for BR element. *)
58 :     | STARTBUTTON of HTML4Utils.tag_payload
59 :     | ENDBUTTON
60 :     | STARTCAPTION of HTML4Utils.tag_payload
61 :     | ENDCAPTION
62 :     | STARTCENTER of HTML4Utils.tag_payload
63 :     | ENDCENTER
64 :     | STARTCITE of HTML4Utils.tag_payload
65 :     | ENDCITE
66 :     | STARTCODE of HTML4Utils.tag_payload
67 :     | ENDCODE
68 :     | STARTCOL of HTML4Utils.tag_payload
69 :     (* No END tag for COL element. *)
70 :     | STARTCOLGROUP of HTML4Utils.tag_payload
71 :     | ENDCOLGROUP
72 :     | STARTDD of HTML4Utils.tag_payload
73 :     | ENDDD
74 :     | STARTDEL of HTML4Utils.tag_payload
75 :     | ENDDEL
76 :     | STARTDFN of HTML4Utils.tag_payload
77 :     | ENDDFN
78 :     | STARTDIR of HTML4Utils.tag_payload
79 :     | ENDDIR
80 :     | STARTDIV of HTML4Utils.tag_payload
81 :     | ENDDIV
82 :     | STARTDL of HTML4Utils.tag_payload
83 :     | ENDDL
84 :     | STARTDT of HTML4Utils.tag_payload
85 :     | ENDDT
86 :     | STARTEM of HTML4Utils.tag_payload
87 :     | ENDEM
88 :     | STARTFIELDSET of HTML4Utils.tag_payload
89 :     | ENDFIELDSET
90 :     | STARTFONT of HTML4Utils.tag_payload
91 :     | ENDFONT
92 :     | STARTFORM of HTML4Utils.tag_payload
93 :     | ENDFORM
94 :     | STARTFRAME of HTML4Utils.tag_payload
95 :     (* No END tag for FRAME element. *)
96 :     | STARTFRAMESET of HTML4Utils.tag_payload
97 :     | ENDFRAMESET
98 :     | STARTH1 of HTML4Utils.tag_payload
99 :     | ENDH1
100 :     | STARTH2 of HTML4Utils.tag_payload
101 :     | ENDH2
102 :     | STARTH3 of HTML4Utils.tag_payload
103 :     | ENDH3
104 :     | STARTH4 of HTML4Utils.tag_payload
105 :     | ENDH4
106 :     | STARTH5 of HTML4Utils.tag_payload
107 :     | ENDH5
108 :     | STARTH6 of HTML4Utils.tag_payload
109 :     | ENDH6
110 :     | STARTHEAD of HTML4Utils.tag_payload
111 :     | ENDHEAD
112 :     | STARTHR of HTML4Utils.tag_payload
113 :     (* No END tag for HR element. *)
114 :     | STARTHTML of HTML4Utils.tag_payload
115 :     | ENDHTML
116 :     | STARTI of HTML4Utils.tag_payload
117 :     | ENDI
118 :     | STARTIFRAME of HTML4Utils.tag_payload
119 :     | ENDIFRAME
120 :     | STARTIMG of HTML4Utils.tag_payload
121 :     (* No END tag for IMG element. *)
122 :     | STARTINPUT of HTML4Utils.tag_payload
123 :     (* No END tag for INPUT element. *)
124 :     | STARTINS of HTML4Utils.tag_payload
125 :     | ENDINS
126 :     | STARTISINDEX of HTML4Utils.tag_payload
127 :     (* No END tag for ISINDEX element. *)
128 :     | STARTKBD of HTML4Utils.tag_payload
129 :     | ENDKBD
130 :     | STARTLABEL of HTML4Utils.tag_payload
131 :     | ENDLABEL
132 :     | STARTLEGEND of HTML4Utils.tag_payload
133 :     | ENDLEGEND
134 :     | STARTLI of HTML4Utils.tag_payload
135 :     | ENDLI
136 :     | STARTLINK of HTML4Utils.tag_payload
137 :     (* No END tag for LINK element. *)
138 :     | STARTMAP of HTML4Utils.tag_payload
139 :     | ENDMAP
140 :     | STARTMENU of HTML4Utils.tag_payload
141 :     | ENDMENU
142 :     | STARTMETA of HTML4Utils.tag_payload
143 :     (* No END tag for META element. *)
144 :     | STARTNOFRAMES of HTML4Utils.tag_payload
145 :     | ENDNOFRAMES
146 :     | STARTNOSCRIPT of HTML4Utils.tag_payload
147 :     | ENDNOSCRIPT
148 :     | STARTOBJECT of HTML4Utils.tag_payload
149 :     | ENDOBJECT
150 :     | STARTOL of HTML4Utils.tag_payload
151 :     | ENDOL
152 :     | STARTOPTGROUP of HTML4Utils.tag_payload
153 :     | ENDOPTGROUP
154 :     | STARTOPTION of HTML4Utils.tag_payload
155 :     | ENDOPTION
156 :     | STARTP of HTML4Utils.tag_payload
157 :     | ENDP
158 :     | STARTPARAM of HTML4Utils.tag_payload
159 :     (* No END tag for PARAM element. *)
160 :     | STARTPRE of HTML4Utils.tag_payload
161 :     | ENDPRE
162 :     | STARTQ of HTML4Utils.tag_payload
163 :     | ENDQ
164 :     | STARTS of HTML4Utils.tag_payload
165 :     | ENDS
166 :     | STARTSAMP of HTML4Utils.tag_payload
167 :     | ENDSAMP
168 :     | STARTSCRIPT of HTML4Utils.tag_payload
169 :     | ENDSCRIPT
170 :     | STARTSELECT of HTML4Utils.tag_payload
171 :     | ENDSELECT
172 :     | STARTSMALL of HTML4Utils.tag_payload
173 :     | ENDSMALL
174 :     | STARTSPAN of HTML4Utils.tag_payload
175 :     | ENDSPAN
176 :     | STARTSTRIKE of HTML4Utils.tag_payload
177 :     | ENDSTRIKE
178 :     | STARTSTRONG of HTML4Utils.tag_payload
179 :     | ENDSTRONG
180 :     | STARTSTYLE of HTML4Utils.tag_payload
181 :     | ENDSTYLE
182 :     | STARTSUB of HTML4Utils.tag_payload
183 :     | ENDSUB
184 :     | STARTSUP of HTML4Utils.tag_payload
185 :     | ENDSUP
186 :     | STARTTABLE of HTML4Utils.tag_payload
187 :     | ENDTABLE
188 :     | STARTTBODY of HTML4Utils.tag_payload
189 :     | ENDTBODY
190 :     | STARTTD of HTML4Utils.tag_payload
191 :     | ENDTD
192 :     | STARTTEXTAREA of HTML4Utils.tag_payload
193 :     | ENDTEXTAREA
194 :     | STARTTFOOT of HTML4Utils.tag_payload
195 :     | ENDTFOOT
196 :     | STARTTH of HTML4Utils.tag_payload
197 :     | ENDTH
198 :     | STARTTHEAD of HTML4Utils.tag_payload
199 :     | ENDTHEAD
200 :     | STARTTITLE of HTML4Utils.tag_payload
201 :     | ENDTITLE
202 :     | STARTTR of HTML4Utils.tag_payload
203 :     | ENDTR
204 :     | STARTTT of HTML4Utils.tag_payload
205 :     | ENDTT
206 :     | STARTU of HTML4Utils.tag_payload
207 :     | ENDU
208 :     | STARTUL of HTML4Utils.tag_payload
209 :     | ENDUL
210 :     | STARTVAR of HTML4Utils.tag_payload
211 :     | ENDVAR
212 :     ;
213 :    
214 :     %start document;
215 :    
216 :     %entry body, flow, block, inline, cdata_opt;
217 :    
218 :     document : cdata_opt
219 :     (DOCTYPE cdata_opt => ((Lf (Tok.DOCTYPE DOCTYPE)) :: cdata_opt))?
220 :     (STARTHTML cdata_opt
221 :     => ((Lf (Tok.STARTHTML STARTHTML)) :: cdata_opt))?
222 :     head
223 :     (body | frameset)
224 :     (ENDHTML cdata_opt => ((Lf (Tok.ENDHTML)) :: cdata_opt))?
225 :     => (Nd (Atom.atom "DOCUMENT",
226 :     cdata_opt @ (optListToList SR1) @ (optListToList SR2) @
227 :     (head :: SR3 :: (optListToList SR4))))
228 :     ;
229 :    
230 :     (* ______________________________________________________________________
231 :     HEAD and related elements
232 :     ______________________________________________________________________ *)
233 :    
234 :     head : (STARTHEAD cdata_opt => ((Lf (Tok.STARTHEAD STARTHEAD)) :: cdata_opt))?
235 :     (head_content cdata_opt => (head_content :: cdata_opt))*
236 :     (ENDHEAD cdata_opt => ((Lf (Tok.ENDHEAD)) :: cdata_opt))?
237 :     => (Nd (Atom.atom "HEAD",
238 :     (optListToList SR1) @ (foldr op@ [] SR2) @ (optListToList SR3)))
239 :     ;
240 :    
241 :     head_content : title | base | script | style | meta | link | object
242 :     ;
243 :    
244 :     title : STARTTITLE cdata_opt ENDTITLE
245 :     => (Nd (Atom.atom "TITLE",
246 :     (Lf (Tok.STARTTITLE STARTTITLE)) ::
247 :     (cdata_opt @ [Lf (Tok.ENDTITLE)])))
248 :     ;
249 :    
250 :     base : STARTBASE
251 :     => (Nd (Atom.atom "BASE", [Lf (Tok.STARTBASE STARTBASE)]))
252 :     ;
253 :    
254 :     script : STARTSCRIPT cdata_opt ENDSCRIPT
255 :     => (Nd (Atom.atom "SCRIPT",
256 :     (Lf (Tok.STARTSCRIPT STARTSCRIPT)) ::
257 :     (cdata_opt @ [Lf (Tok.ENDSCRIPT)])))
258 :     ;
259 :    
260 :     style : STARTSTYLE cdata_opt ENDSTYLE
261 :     => (Nd (Atom.atom "STYLE",
262 :     (Lf (Tok.STARTSTYLE STARTSTYLE)) ::
263 :     (cdata_opt @ [Lf (Tok.ENDSTYLE)])))
264 :     ;
265 :    
266 :     meta : STARTMETA
267 :     => (Nd (Atom.atom "META", [Lf (Tok.STARTMETA STARTMETA)]))
268 :     ;
269 :    
270 :     link : STARTLINK
271 :     => (Nd (Atom.atom "LINK", [Lf (Tok.STARTLINK STARTLINK)]))
272 :     ;
273 :    
274 :     object : STARTOBJECT (param | flow)* ENDOBJECT
275 :     => (Nd (Atom.atom "OBJECT",
276 :     (Lf (Tok.STARTOBJECT STARTOBJECT)) ::
277 :     (SR @ [Lf (Tok.ENDOBJECT)])))
278 :     ;
279 :    
280 :     param : STARTPARAM
281 :     => (Nd (Atom.atom "PARAM", [(Lf (Tok.STARTPARAM STARTPARAM))]))
282 :     ;
283 :    
284 :     (* ______________________________________________________________________
285 :     BODY and related elements
286 :     ______________________________________________________________________ *)
287 :    
288 :     body : STARTBODY body_rest
289 :     => (Nd (Atom.atom "BODY",
290 :     (Lf (Tok.STARTBODY STARTBODY)) :: body_rest))
291 :     | (block | ins | del) body_rest
292 :     => (Nd (Atom.atom "BODY", SR :: body_rest))
293 :     ;
294 :    
295 :     body_rest : (block | script | ins | del | cdata)*
296 :     (ENDBODY cdata_opt => ((Lf (Tok.ENDBODY)) :: cdata_opt))?
297 :     => (SR1 @ (optListToList SR2))
298 :     ;
299 :    
300 :     flow : block
301 :     | inline
302 :     ;
303 :    
304 :     block : p
305 :     | heading
306 :     | list
307 :     | preformatted
308 :     | dl
309 :     | div
310 :     | noscript
311 :     | blockquote
312 :     | form
313 :     | hr
314 :     | table
315 :     | fieldset
316 :     | address
317 :     | block_loose
318 :     ;
319 :    
320 :     block_loose : center
321 :     | isindex
322 :     ;
323 :    
324 :     heading : h1
325 :     | h2
326 :     | h3
327 :     | h4
328 :     | h5
329 :     | h6
330 :     ;
331 :    
332 :     list : ul
333 :     | ol
334 :     | list_loose
335 :     ;
336 :    
337 :     list_loose : dir
338 :     | menu
339 :     ;
340 :    
341 :     preformatted : pre
342 :     ;
343 :    
344 :     inline : fontstyle
345 :     | phrase
346 :     | special
347 :     | formctrl
348 :     | cdata
349 :     ;
350 :    
351 :     fontstyle : tt
352 :     | i
353 :     | b
354 :     | big
355 :     | small
356 :     | fontstyle_loose
357 :     ;
358 :    
359 :     fontstyle_loose : u
360 :     | s
361 :     | strike
362 :     ;
363 :    
364 :     phrase : em
365 :     | strong
366 :     | dfn
367 :     | code
368 :     | samp
369 :     | kbd
370 :     | var
371 :     | cite
372 :     | abbr
373 :     | acronym
374 :     ;
375 :    
376 :     special : a
377 :     | img
378 :     | object
379 :     | br
380 :     | script
381 :     | map
382 :     | q
383 :     | sub
384 :     | sup
385 :     | span
386 :     | bdo
387 :     | special_loose
388 :     ;
389 :    
390 :     special_loose : applet
391 :     | basefont
392 :     | font
393 :     | iframe
394 :     ;
395 :    
396 :     formctrl : input
397 :     | select
398 :     | textarea
399 :     | label
400 :     | button
401 :     ;
402 :    
403 :     (* Actual elements *)
404 :    
405 :     a : STARTA inline* ENDA
406 :     => (Nd (Atom.atom "A",
407 :     (Lf (Tok.STARTA STARTA)) :: (inline @ [Lf (Tok.ENDA)])))
408 :     ;
409 :    
410 :     abbr : STARTABBR inline* ENDABBR
411 :     => (Nd (Atom.atom "ABBR",
412 :     (Lf (Tok.STARTABBR STARTABBR)) ::
413 :     (inline @ [Lf (Tok.ENDABBR)])))
414 :     ;
415 :    
416 :     acronym : STARTACRONYM inline* ENDACRONYM
417 :     => (Nd (Atom.atom "ACRONYM",
418 :     (Lf (Tok.STARTACRONYM STARTACRONYM)) ::
419 :     (inline @ [Lf (Tok.ENDACRONYM)])))
420 :     ;
421 :    
422 :     address : STARTADDRESS inline* ENDADDRESS
423 :     => (Nd (Atom.atom "ADDRESS",
424 :     (Lf (Tok.STARTADDRESS STARTADDRESS)) ::
425 :     (inline @ [Lf (Tok.ENDADDRESS)])))
426 :     ;
427 :    
428 :     applet : STARTAPPLET (param | flow)* ENDAPPLET
429 :     => (Nd (Atom.atom "APPLET",
430 :     (Lf (Tok.STARTAPPLET STARTAPPLET)) ::
431 :     (SR @ [Lf (Tok.ENDAPPLET)])))
432 :     ;
433 :    
434 :     area : STARTAREA
435 :     => (Nd (Atom.atom "AREA", [Lf (Tok.STARTAREA STARTAREA)]))
436 :     ;
437 :    
438 :     b : STARTB inline* ENDB
439 :     => (Nd (Atom.atom "B",
440 :     (Lf (Tok.STARTB STARTB)) :: (inline @ [Lf (Tok.ENDB)])))
441 :     ;
442 :    
443 :     basefont : STARTBASEFONT
444 :     => (Nd (Atom.atom "BASEFONT", [Lf (Tok.STARTBASEFONT STARTBASEFONT)]))
445 :     ;
446 :    
447 :     bdo : STARTBDO inline* ENDBDO
448 :     => (Nd (Atom.atom "BDO",
449 :     (Lf (Tok.STARTBDO STARTBDO)) ::
450 :     (inline @ [Lf (Tok.ENDBDO)])))
451 :     ;
452 :    
453 :     big : STARTBIG inline* ENDBIG
454 :     => (Nd (Atom.atom "BIG",
455 :     (Lf (Tok.STARTBIG STARTBIG)) ::
456 :     (inline @ [Lf (Tok.ENDBIG)])))
457 :     ;
458 :    
459 :     blockquote : STARTBLOCKQUOTE (block | script | cdata)+ ENDBLOCKQUOTE
460 :     => (Nd (Atom.atom "BLOCKQUOTE",
461 :     (Lf (Tok.STARTBLOCKQUOTE STARTBLOCKQUOTE)) ::
462 :     (SR @ [Lf (Tok.ENDBLOCKQUOTE)])))
463 :     ;
464 :    
465 :     br : STARTBR
466 :     => (Nd (Atom.atom "BR", [Lf (Tok.STARTBR STARTBR)]))
467 :     ;
468 :    
469 :     button : STARTBUTTON flow* ENDBUTTON
470 :     => (Nd (Atom.atom "BUTTON",
471 :     (Lf (Tok.STARTBUTTON STARTBUTTON)) ::
472 :     (flow @ [Lf (Tok.ENDBUTTON)])))
473 :     ;
474 :    
475 :     caption : STARTCAPTION inline* ENDCAPTION
476 :     => (Nd (Atom.atom "CAPTION",
477 :     (Lf (Tok.STARTCAPTION STARTCAPTION)) ::
478 :     (inline @ [Lf (Tok.ENDCAPTION)])))
479 :     ;
480 :    
481 :     center : STARTCENTER flow* ENDCENTER
482 :     => (Nd (Atom.atom "CENTER",
483 :     (Lf (Tok.STARTCENTER STARTCENTER)) ::
484 :     (flow @ [Lf (Tok.ENDCENTER)])))
485 :     ;
486 :    
487 :     cite : STARTCITE inline* ENDCITE
488 :     => (Nd (Atom.atom "CITE",
489 :     (Lf (Tok.STARTCITE STARTCITE)) ::
490 :     (inline @ [Lf (Tok.ENDCITE)])))
491 :     ;
492 :    
493 :     code : STARTCODE inline* ENDCODE
494 :     => (Nd (Atom.atom "CODE",
495 :     (Lf (Tok.STARTCODE STARTCODE)) ::
496 :     (inline @ [Lf (Tok.ENDCODE)])))
497 :     ;
498 :    
499 :     col : STARTCOL
500 :     => (Nd (Atom.atom "COL", [Lf (Tok.STARTCOL STARTCOL)]))
501 :     ;
502 :    
503 :     colgroup : STARTCOLGROUP cdata_opt
504 :     (col cdata_opt => (col :: cdata_opt))*
505 :     (ENDCOLGROUP => (Lf (Tok.ENDCOLGROUP)))?
506 :     => (Nd (Atom.atom "COLGROUP",
507 :     (Lf (Tok.STARTCOLGROUP STARTCOLGROUP)) ::
508 :     (cdata_opt @ (foldr op@ [] SR1) @ (optToList SR2))))
509 :     ;
510 :    
511 :     dd : STARTDD flow* (ENDDD => (Lf (Tok.ENDDD)))?
512 :     => (Nd (Atom.atom "DD",
513 :     (Lf (Tok.STARTDD STARTDD)) :: (flow @ (optToList SR))))
514 :     ;
515 :    
516 :     del : STARTDEL flow* ENDDEL
517 :     => (Nd (Atom.atom "DEL",
518 :     (Lf (Tok.STARTDEL STARTDEL)) ::
519 :     (flow @ [Lf (Tok.ENDDEL)])))
520 :     ;
521 :    
522 :     dfn : STARTDFN inline* ENDDFN
523 :     => (Nd (Atom.atom "DFN",
524 :     (Lf (Tok.STARTDFN STARTDFN)) ::
525 :     (inline @ [Lf (Tok.ENDDFN)])))
526 :     ;
527 :    
528 :     dir : STARTDIR cdata_opt li+ ENDDIR
529 :     => (Nd (Atom.atom "DIR",
530 :     (Lf (Tok.STARTDIR STARTDIR)) ::
531 :     (cdata_opt @ li @ [Lf (Tok.ENDDIR)])))
532 :     ;
533 :    
534 :     div : STARTDIV flow* ENDDIV
535 :     => (Nd (Atom.atom "DIV",
536 :     (Lf (Tok.STARTDIV STARTDIV)) ::
537 :     (flow @ [Lf (Tok.ENDDIV)])))
538 :     ;
539 :    
540 :     dl : STARTDL cdata_opt (dt | dd)+ ENDDL
541 :     => (Nd (Atom.atom "DL",
542 :     (Lf (Tok.STARTDL STARTDL)) ::
543 :     (cdata_opt @ SR @ [Lf (Tok.ENDDL)])))
544 :     ;
545 :    
546 :     dt : STARTDT inline* (ENDDT => (Lf (Tok.ENDDT)))?
547 :     => (Nd (Atom.atom "DT",
548 :     (Lf (Tok.STARTDT STARTDT)) :: (inline @ (optToList SR))))
549 :     ;
550 :    
551 :     em : STARTEM inline* ENDEM
552 :     => (Nd (Atom.atom "EM",
553 :     (Lf (Tok.STARTEM STARTEM)) :: (inline @ [Lf (Tok.ENDEM)])))
554 :     ;
555 :    
556 :     fieldset : STARTFIELDSET cdata_opt legend flow* ENDFIELDSET
557 :     => (Nd (Atom.atom "FIELDSET",
558 :     (Lf (Tok.STARTFIELDSET STARTFIELDSET)) ::
559 :     (cdata_opt @ [legend] @ flow @
560 :     [Lf (Tok.ENDFIELDSET)])))
561 :     ;
562 :    
563 :     font : STARTFONT inline* ENDFONT
564 :     => (Nd (Atom.atom "FONT",
565 :     (Lf (Tok.STARTFONT STARTFONT)) ::
566 :     (inline @ [Lf (Tok.ENDFONT)])))
567 :     ;
568 :    
569 :     form : STARTFORM (cdata | block | script)+ ENDFORM
570 :     => (Nd (Atom.atom "FORM",
571 :     (Lf (Tok.STARTFORM STARTFORM)) ::
572 :     (SR @ [Lf (Tok.ENDFORM)])))
573 :     ;
574 :    
575 :     frame : STARTFRAME
576 :     => (Nd (Atom.atom "FRAME", [Lf (Tok.STARTFRAME STARTFRAME)]))
577 :     ;
578 :    
579 :     frameset : STARTFRAMESET (frameset | frame | cdata)+
580 :     (noframes cdata_opt => (noframes::cdata_opt))? ENDFRAMESET
581 :     => (Nd (Atom.atom "FRAMESET",
582 :     (Lf (Tok.STARTFRAMESET STARTFRAMESET)) ::
583 :     (SR1 @ (optListToList SR2) @ [Lf (Tok.ENDFRAMESET)])))
584 :     ;
585 :    
586 :     h1 : STARTH1 inline* ENDH1
587 :     => (Nd (Atom.atom "H1",
588 :     (Lf (Tok.STARTH1 STARTH1)) :: (inline @ [Lf (Tok.ENDH1)])))
589 :     ;
590 :    
591 :     h2 : STARTH2 inline* ENDH2
592 :     => (Nd (Atom.atom "H2",
593 :     (Lf (Tok.STARTH2 STARTH2)) :: (inline @ [Lf (Tok.ENDH2)])))
594 :     ;
595 :    
596 :     h3 : STARTH3 inline* ENDH3
597 :     => (Nd (Atom.atom "H3",
598 :     (Lf (Tok.STARTH3 STARTH3)) :: (inline @ [Lf (Tok.ENDH3)])))
599 :     ;
600 :    
601 :     h4 : STARTH4 inline* ENDH4
602 :     => (Nd (Atom.atom "H4",
603 :     (Lf (Tok.STARTH4 STARTH4)) :: (inline @ [Lf (Tok.ENDH4)])))
604 :     ;
605 :    
606 :     h5 : STARTH5 inline* ENDH5
607 :     => (Nd (Atom.atom "H5",
608 :     (Lf (Tok.STARTH5 STARTH5)) :: (inline @ [Lf (Tok.ENDH5)])))
609 :     ;
610 :    
611 :     h6 : STARTH6 inline* ENDH6
612 :     => (Nd (Atom.atom "H6",
613 :     (Lf (Tok.STARTH6 STARTH6)) :: (inline @ [Lf (Tok.ENDH6)])))
614 :     ;
615 :    
616 :     hr : STARTHR
617 :     => (Nd (Atom.atom "HR", [Lf (Tok.STARTHR STARTHR)]))
618 :     ;
619 :    
620 :     i : STARTI inline* ENDI
621 :     => (Nd (Atom.atom "I",
622 :     (Lf (Tok.STARTI STARTI)) ::
623 :     (inline @ [Lf (Tok.ENDI)])))
624 :     ;
625 :    
626 :     iframe : STARTIFRAME flow* ENDIFRAME
627 :     => (Nd (Atom.atom "IFRAME",
628 :     (Lf (Tok.STARTIFRAME STARTIFRAME)) ::
629 :     (flow @ [Lf (Tok.ENDIFRAME)])))
630 :     ;
631 :    
632 :     img : STARTIMG
633 :     => (Nd (Atom.atom "IMG", [Lf (Tok.STARTIMG STARTIMG)]))
634 :     ;
635 :    
636 :     input : STARTINPUT
637 :     => (Nd (Atom.atom "INPUT", [Lf (Tok.STARTINPUT STARTINPUT)]))
638 :     ;
639 :    
640 :     ins : STARTINS flow* ENDINS
641 :     => (Nd (Atom.atom "INS",
642 :     (Lf (Tok.STARTINS STARTINS)) ::
643 :     (flow @ [Lf (Tok.ENDINS)])))
644 :     ;
645 :    
646 :     isindex : STARTISINDEX
647 :     => (Nd (Atom.atom "ISINDEX", [Lf (Tok.STARTISINDEX STARTISINDEX)]))
648 :     ;
649 :    
650 :     kbd : STARTKBD inline* ENDKBD
651 :     => (Nd (Atom.atom "KBD",
652 :     (Lf (Tok.STARTKBD STARTKBD)) ::
653 :     (inline @ [Lf (Tok.ENDKBD)])))
654 :     ;
655 :    
656 :     label : STARTLABEL inline* ENDLABEL
657 :     => (Nd (Atom.atom "LABEL",
658 :     (Lf (Tok.STARTLABEL STARTLABEL)) ::
659 :     (inline @ [Lf (Tok.ENDLABEL)])))
660 :     ;
661 :    
662 :     legend : STARTLEGEND inline* ENDLEGEND
663 :     => (Nd (Atom.atom "LEGEND",
664 :     (Lf (Tok.STARTLEGEND STARTLEGEND)) ::
665 :     (inline @ [Lf (Tok.ENDLEGEND)])))
666 :     ;
667 :    
668 :     li : STARTLI flow* (ENDLI => (Lf (Tok.ENDLI)))?
669 :     => (Nd (Atom.atom "LI",
670 :     (Lf (Tok.STARTLI STARTLI)) :: (flow @ (optToList SR))))
671 :     ;
672 :    
673 :     map : STARTMAP (cdata | block | area)+ ENDMAP
674 :     => (Nd (Atom.atom "MAP",
675 :     (Lf (Tok.STARTMAP STARTMAP)) :: (SR @ [Lf (Tok.ENDMAP)])))
676 :     ;
677 :    
678 :     menu : STARTMENU cdata_opt li+ ENDMENU
679 :     => (Nd (Atom.atom "MENU",
680 :     (Lf (Tok.STARTMENU STARTMENU)) ::
681 :     (cdata_opt @ li @ [Lf (Tok.ENDMENU)])))
682 :     ;
683 :    
684 :     noframes : STARTNOFRAMES body ENDNOFRAMES
685 :     => (Nd (Atom.atom "NOFRAMES",
686 :     [Lf (Tok.STARTNOFRAMES STARTNOFRAMES), body,
687 :     Lf (Tok.ENDNOFRAMES)]))
688 :     ;
689 :    
690 :     noscript : STARTNOSCRIPT (cdata | block)+ ENDNOSCRIPT
691 :     => (Nd (Atom.atom "NOSCRIPT",
692 :     (Lf (Tok.STARTNOSCRIPT STARTNOSCRIPT)) ::
693 :     (SR @ [Lf (Tok.ENDNOSCRIPT)])))
694 :     ;
695 :    
696 :     ol : STARTOL cdata_opt li+ ENDOL
697 :     => (Nd (Atom.atom "OL",
698 :     (Lf (Tok.STARTOL STARTOL)) ::
699 :     (cdata_opt @ li @ [Lf (Tok.ENDOL)])))
700 :     ;
701 :    
702 :     optgroup : STARTOPTGROUP cdata_opt option+ ENDOPTGROUP cdata_opt
703 :     => (Nd (Atom.atom "OPTGROUP",
704 :     (Lf (Tok.STARTOPTGROUP STARTOPTGROUP)) ::
705 :     (cdata_opt1 @ option @ ((Lf (Tok.ENDOPTGROUP))
706 :     :: cdata_opt2))))
707 :     ;
708 :    
709 :     option : STARTOPTION cdata_opt
710 :     (ENDOPTION cdata_opt => ((Lf (Tok.ENDOPTION)) ::
711 :     cdata_opt))?
712 :     => (Nd (Atom.atom "OPTION",
713 :     (Lf (Tok.STARTOPTION STARTOPTION)) ::
714 :     (cdata_opt @ (optListToList SR))))
715 :     ;
716 :    
717 :     (* TODO: Making the ENDP optional, which is valid, causes
718 :     left-recursion for the inline* part. This can be fixed by having a
719 :     two state flow nonterminal, which the older HTML library does. *)
720 :    
721 :     p : STARTP inline* ENDP
722 :     => (Nd (Atom.atom "P",
723 :     (Lf (Tok.STARTP STARTP)) :: (inline @ [Lf (Tok.ENDP)])))
724 :     ;
725 :    
726 :     pre : STARTPRE inline* ENDPRE
727 :     => (Nd (Atom.atom "PRE",
728 :     (Lf (Tok.STARTPRE STARTPRE)) ::
729 :     (inline @ [Lf (Tok.ENDPRE)])))
730 :     ;
731 :    
732 :     q : STARTQ inline* ENDQ
733 :     => (Nd (Atom.atom "Q",
734 :     (Lf (Tok.STARTQ STARTQ)) :: (inline @ [Lf (Tok.ENDQ)])))
735 :     ;
736 :    
737 :     s : STARTS inline* ENDS
738 :     => (Nd (Atom.atom "S",
739 :     (Lf (Tok.STARTS STARTS)) :: (inline @ [Lf (Tok.ENDS)])))
740 :     ;
741 :    
742 :     samp : STARTSAMP inline* ENDSAMP
743 :     => (Nd (Atom.atom "SAMP",
744 :     (Lf (Tok.STARTSAMP STARTSAMP)) ::
745 :     (inline @ [Lf (Tok.ENDSAMP)])))
746 :     ;
747 :    
748 :     select : STARTSELECT cdata_opt (optgroup | option)+ ENDSELECT
749 :     => (Nd (Atom.atom "SELECT",
750 :     (Lf (Tok.STARTSELECT STARTSELECT)) ::
751 :     (cdata_opt @ SR @ [Lf (Tok.ENDSELECT)])))
752 :     ;
753 :    
754 :     small : STARTSMALL inline* ENDSMALL
755 :     => (Nd (Atom.atom "SMALL",
756 :     (Lf (Tok.STARTSMALL STARTSMALL)) ::
757 :     (inline @ [Lf (Tok.ENDSMALL)])))
758 :     ;
759 :    
760 :     span : STARTSPAN inline* ENDSPAN
761 :     => (Nd (Atom.atom "SPAN",
762 :     (Lf (Tok.STARTSPAN STARTSPAN)) ::
763 :     (inline @ [Lf (Tok.ENDSPAN)])))
764 :     ;
765 :    
766 :     strike : STARTSTRIKE inline* ENDSTRIKE
767 :     => (Nd (Atom.atom "STRIKE",
768 :     (Lf (Tok.STARTSTRIKE STARTSTRIKE)) ::
769 :     (inline @ [Lf (Tok.ENDSTRIKE)])))
770 :     ;
771 :    
772 :     strong : STARTSTRONG inline* ENDSTRONG
773 :     => (Nd (Atom.atom "STRONG",
774 :     (Lf (Tok.STARTSTRONG STARTSTRONG)) ::
775 :     (inline @ [Lf (Tok.ENDSTRONG)])))
776 :     ;
777 :    
778 :     sub : STARTSUB inline* ENDSUB
779 :     => (Nd (Atom.atom "SUB",
780 :     (Lf (Tok.STARTSUB STARTSUB)) ::
781 :     (inline @ [Lf (Tok.ENDSUB)])))
782 :     ;
783 :    
784 :     sup : STARTSUP inline* ENDSUP
785 :     => (Nd (Atom.atom "SUP",
786 :     (Lf (Tok.STARTSUP STARTSUP)) ::
787 :     (inline @ [Lf (Tok.ENDSUP)])))
788 :     ;
789 :    
790 :     (* My reading of the HTML DTD indicates the following order of
791 :     elements is enforceable: *)
792 :    
793 :     table : STARTTABLE cdata_opt
794 :     (caption cdata_opt => (caption :: cdata_opt))?
795 :     col_or_colgroups table_content ENDTABLE
796 :     => (Nd (Atom.atom "TABLE",
797 :     (Lf (Tok.STARTTABLE STARTTABLE)) ::
798 :     (cdata_opt @ (optListToList SR) @ col_or_colgroups @
799 :     table_content @ [Lf (Tok.ENDTABLE)])))
800 :     ;
801 :    
802 :     (* The whole tr+ thing makes the original table production ambiguous:
803 :     STARTTABLE ... thead? tfoot? tbody+ ENDTABLE *)
804 :    
805 :     table_content
806 :     : thead tfoot? tbodies
807 :     => (thead :: ((optToList tfoot)) @ tbodies)
808 :     | tfoot tbodies
809 :     => (tfoot :: tbodies)
810 :     | tbodies_nostart
811 :     ;
812 :    
813 :     col_or_colgroups : (* empty *)
814 :     => ([])
815 :     | (col cdata_opt => (col :: cdata_opt))+
816 :     => (foldr op@ [] SR)
817 :     | colgroup+
818 :     ;
819 :    
820 :    
821 :     tbodies_nostart : (STARTTBODY cdata_opt =>
822 :     ((Lf (Tok.STARTTBODY STARTTBODY)) :: cdata_opt))?
823 :     tr+ tbodies_rest?
824 :     => (let val (tbody_rest, tbody_peers) =
825 :     case tbodies_rest of
826 :     NONE => ([], [])
827 :     | SOME tbodies_tup => tbodies_tup
828 :     in (Nd (Atom.atom "TBODIES_NOSTART",
829 :     (optListToList SR) @ tr @ tbody_rest)) ::
830 :     tbody_peers end)
831 :     ;
832 :    
833 :     tbodies : STARTTBODY cdata_opt tr+ tbodies_rest
834 :     => (let val (tbody_rest, tbody_peers) = tbodies_rest
835 :     in (Nd (Atom.atom "TBODIES",
836 :     (Lf (Tok.STARTTBODY STARTTBODY)) ::
837 :     (cdata_opt @ tr @ tbody_rest))) ::
838 :     tbody_peers end)
839 :     ;
840 :    
841 :     tbodies_rest : ENDTBODY cdata_opt tbodies?
842 :     => ((Lf (Tok.ENDTBODY)) :: cdata_opt,
843 :     optListToList tbodies)
844 :     | STARTTBODY cdata_opt tr+ tbodies_rest?
845 :     => (let val (tbody_rest, tbody_peers) =
846 :     case tbodies_rest of NONE => ([], [])
847 :     | SOME tbodies_tup => tbodies_tup
848 :     in ([], (Nd (Atom.atom "TBODIES_REST",
849 :     (Lf (Tok.STARTTBODY STARTTBODY)) ::
850 :     (cdata_opt @ tr @ tbody_rest))) :: tbody_peers)
851 :     end)
852 :     ;
853 :    
854 :     td : STARTTD flow* (ENDTD cdata_opt => ((Lf (Tok.ENDTD)) :: cdata_opt))?
855 :     => (Nd (Atom.atom "TD",
856 :     (Lf (Tok.STARTTD STARTTD)) :: (flow @ (optListToList SR))))
857 :     ;
858 :    
859 :     textarea : STARTTEXTAREA cdata_opt ENDTEXTAREA
860 :     => (Nd (Atom.atom "TEXTAREA",
861 :     (Lf (Tok.STARTTEXTAREA STARTTEXTAREA)) ::
862 :     (cdata_opt @ [Lf (Tok.ENDTEXTAREA)])))
863 :     ;
864 :    
865 :     tfoot : STARTTFOOT cdata_opt tr+
866 :     (ENDTFOOT cdata_opt => ((Lf (Tok.ENDTFOOT)) :: cdata_opt))?
867 :     => (Nd (Atom.atom "TFOOT",
868 :     (Lf (Tok.STARTTFOOT STARTTFOOT)) :: (cdata_opt @ tr @
869 :     (optListToList SR))))
870 :     ;
871 :    
872 :     th : STARTTH flow* (ENDTH cdata_opt => ((Lf (Tok.ENDTH)) :: cdata_opt))?
873 :     => (Nd (Atom.atom "TH",
874 :     (Lf (Tok.STARTTH STARTTH)) :: (flow @ (optListToList SR))))
875 :     ;
876 :    
877 :     thead : STARTTHEAD cdata_opt tr+
878 :     (ENDTHEAD cdata_opt => ((Lf (Tok.ENDTHEAD)) :: cdata_opt))?
879 :     => (Nd (Atom.atom "THEAD",
880 :     (Lf (Tok.STARTTHEAD STARTTHEAD)) :: (cdata_opt @ tr @
881 :     (optListToList SR))))
882 :     ;
883 :    
884 :     tr : STARTTR cdata_opt (th | td)+
885 :     (ENDTR cdata_opt => ((Lf (Tok.ENDTR)) :: cdata_opt))?
886 :     => (Nd (Atom.atom "TR",
887 :     (Lf (Tok.STARTTR STARTTR)) :: (cdata_opt @ SR1 @
888 :     (optListToList SR2))))
889 :     ;
890 :    
891 :     tt : STARTTT inline* ENDTT
892 :     => (Nd (Atom.atom "TT",
893 :     (Lf (Tok.STARTTT STARTTT)) :: (inline @ [Lf (Tok.ENDTT)])))
894 :     ;
895 :    
896 :     u : STARTU inline* ENDU
897 :     => (Nd (Atom.atom "U",
898 :     (Lf (Tok.STARTU STARTU)) :: (inline @ [Lf (Tok.ENDU)])))
899 :     ;
900 :    
901 :     ul : STARTUL cdata_opt li+ ENDUL
902 :     => (Nd (Atom.atom "UL",
903 :     ((Lf (Tok.STARTUL STARTUL)) :: (cdata_opt @ li @
904 :     [Lf (Tok.ENDUL)]))))
905 :     ;
906 :    
907 :     var : STARTVAR inline* ENDVAR
908 :     => (Nd (Atom.atom "VAR",
909 :     (Lf (Tok.STARTVAR STARTVAR)) :: (inline @
910 :     [Lf (Tok.ENDVAR)])))
911 :     ;
912 :    
913 :     (* ______________________________________________________________________
914 :     Miscellaneous data nonterminals
915 :     ______________________________________________________________________ *)
916 :    
917 :     cdata : (PCDATA => (Tok.PCDATA PCDATA)
918 :     | CHAR_REF => (Tok.CHAR_REF CHAR_REF)
919 :     | ENTITY_REF => (Tok.ENTITY_REF ENTITY_REF)
920 :     | COMMENT => (Tok.COMMENT COMMENT))
921 :     => ((Lf SR) : HTML4Tokens.token parsetree)
922 :     ;
923 :    
924 :     cdata_opt : cdata* => (cdata : HTML4Tokens.token parsetree list)
925 :     ;
926 :    
927 :     (* ______________________________________________________________________
928 :     End of html4.g
929 :     ______________________________________________________________________ *)

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