html.g
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:14k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2. Based on the HTML 3.2 spec. by the W3 (http://www.w3.org)
  3. Alexander Hinds & Terence Parr
  4. Magelang Institute, Ltd.
  5. Send comments to:  parrt@jguru.com
  6. v1.2 Fixed a bug APARAM->APARM in APPLET tag.
  7. v1.1 Terence Parr (updated to 2.6.0)
  8. Fixed CCYTE->CCITE
  9. Fixed def of COMMENT_DATA so it scarfs stuff correctly.
  10. Also, fixed refs to (PCDATA)? -> (PCDATA)* because a comment
  11. between PCDATA returns 2 PCDATA--ya need the loop not optional.
  12. v1.0 Terence John Parr (version 2.5.0 of ANTLR required)
  13. Fixed how whitespace as handled, removing some ambiguities; some
  14. because of ANTLR lexical filtering in 2.5.0.
  15. Changed (PCDATA)* loops to (PCDATA)? general since PCDATA matches
  16. everything between valid tags (how could there be more than one
  17. between tags?)
  18. Made the DOCTYPE optional.
  19. Reduced lookahead from k=5 to k=1 on the parser and number
  20. of parser ambiguities to 2.  Reduced lexer lookahead from 6
  21. to 4; had to left factor a bunch of stuff.
  22. List items couldn't contain nested lists...fixed it.
  23. Fixed def of WORD so it can't be an INT.  Removed '-' from WORD.
  24. Fixed HEXNUM so it will allow letters A..F.
  25. KNOWN ISSUES:
  26. 1.  Does not handle "staggered" tags, eg: <p> <i> <p> <i>
  27. 2.  Adhere's somewhat strictly to the html spec, so many pages
  28. won't parse without errors.
  29. 3.  Doesn't convert &(a signifier) to it's proper single char 
  30. representation
  31. 4.  Checks only the syntax of element attributes, not the semantics,
  32. e.g. won't very that a base element's attribute is actually
  33. called "href" 
  34. 5.  Tags split across lines, for example, <A (NEWLINE) some text >
  35. won't be properly recognized.  TJP: I think I fixed this.
  36. 7.  Lines not counted properly due to the def'n of PCDATA - see the
  37. alternate def'n for a possible fix.  TJP: I think I fixed this.
  38. */
  39. class HTMLParser extends Parser;
  40. options {
  41. exportVocab=HTML;
  42. k = 1;
  43. }
  44. document
  45. :  (PCDATA)? (DOCTYPE (PCDATA)?)?
  46. (OHTML (PCDATA)?)?
  47. (head)?
  48. (body)?
  49. (CHTML (PCDATA)?)?
  50. ;
  51. head:  (OHEAD (PCDATA)?)?
  52. head_element
  53. (PCDATA | head_element)* 
  54. (CHEAD (PCDATA)?)? 
  55. ;
  56. head_element
  57. : title //bug need at least a title, rest optional
  58. | script
  59. | style
  60. | ISINDEX
  61. | BASE
  62. | META
  63. | LINK
  64. ;
  65. title
  66. : OTITLE (PCDATA)? CTITLE
  67. ;
  68. script
  69. : OSCRIPT (~CSCRIPT)+ CSCRIPT
  70. ;
  71. style
  72. : OSTYLE (~CSTYLE)+ CSTYLE
  73. ;
  74. body:  ( OBODY (PCDATA)* )? 
  75. body_content_no_PCDATA
  76. ( body_content )+ 
  77. ( CBODY (PCDATA)* )? 
  78. ;
  79. body_content_no_PCDATA
  80. : body_tag | text_tag
  81. ;
  82. body_tag
  83. :  heading | block | ADDRESS
  84. ;
  85. body_content
  86. :  body_tag | text
  87. ;
  88. /*revised*/
  89. heading
  90. : h1 | h2 | h3 | h4 | h5 | h6
  91. ;
  92. block
  93. : paragraph | list | preformatted | div |
  94. center | blockquote | HR | table
  95. ; //bug - ?FORM v %form, ISINDEX here too?
  96. font: teletype | italic | bold | underline | strike | 
  97. big | small | subscript | superscript
  98. ;
  99. phrase
  100. : emphasize | strong | definition | code | sample_output|
  101. keyboard_text | variable | citation
  102. ;
  103. special
  104. : anchor | IMG | applet | font_dfn | BFONT |
  105. map | BR 
  106. ;
  107. text_tag
  108. : font | phrase | special | form
  109. ;
  110. text: PCDATA | text_tag
  111. ;
  112. /*end*/
  113. /*BLOCK ELEMENTS*/
  114. h1 : OH1 (block | text)* CH1
  115. ;
  116. h2 : OH2 (block | text)* CH2
  117. ;
  118. h3 : OH3 (block | text)* CH3
  119. ;
  120. h4 : OH4 (block | text)* CH4
  121. ;
  122. h5 : OH5 (block | text)* CH5
  123. ;
  124. h6 : OH6 (block | text)* CH6
  125. ;
  126. address
  127. : OADDRESS (PCDATA)* CADDRESS
  128. ;
  129. //NOTE:  according to the standard, paragraphs can't contain block elements
  130. //like HR.  Netscape may insert these elements into paragraphs.
  131. //We adhere strictly here.
  132. paragraph
  133. : OPARA
  134. (
  135. /* Rule body_content may also be just plain text because HTML is
  136. so loose.  When body puts body_content in a loop, ANTLR
  137. doesn't know whether you want it to match all the text as part
  138. of this paragraph (in the case where the </p> is missing) or
  139. if the body rule should scarf it.  This is analogous to the
  140. dangling-else clause.  I shut off the warning.
  141. */
  142. options {
  143. generateAmbigWarnings=false;
  144. }
  145. : text
  146. )*
  147. (CPARA)?
  148. ;
  149. list: unordered_list
  150. | ordered_list
  151. | def_list
  152. ;
  153. unordered_list
  154. : OULIST (PCDATA)* (list_item)+ CULIST
  155. ;
  156. ordered_list
  157. : OOLIST (PCDATA)* (list_item)+ COLIST
  158. ;
  159. def_list
  160. : ODLIST (PCDATA)* (def_list_item)+ CDLIST 
  161. ;
  162. list_item
  163. : OLITEM ( text | list )+ (CLITEM (PCDATA)*)?
  164. ;
  165. def_list_item
  166. : dt | dd
  167. ;
  168. dt : ODTERM (text)+ CDTERM (PCDATA)*
  169. ;
  170. dd : ODDEF (text | block)+ CDTERM (PCDATA)*
  171. ;
  172. dir : ODIR (list_item)+ CDIR
  173. ;
  174. menu: OMENU (list_item)+ CMENU
  175. ;
  176. preformatted
  177. : OPRE (text)+ CPRE
  178. ;
  179. div : ODIV (body_content)* CDIV //semi-revised
  180. ;
  181. center
  182. : OCENTER (body_content)* CCENTER //semi-revised
  183. ;
  184. blockquote
  185. : OBQUOTE PCDATA CBQUOTE
  186. ;
  187. form: OFORM (form_field | body_content)* CFORM
  188. ;
  189. table
  190. : OTABLE (caption)? (PCDATA)* (tr)+ CTABLE
  191. ;
  192. caption
  193. : OCAP (text)* CCAP
  194. ;
  195. tr : O_TR (PCDATA)* (th_or_td)* (C_TR (PCDATA)*)? 
  196. ;
  197. th_or_td
  198. : O_TH_OR_TD (body_content)* (C_TH_OR_TD (PCDATA)*)?
  199. ;
  200. /*TEXT ELEMENTS*/
  201. /*font style*/
  202. teletype
  203. : OTTYPE ( text )+ CTTYPE
  204. ;
  205. italic
  206. : OITALIC ( text )+ CITALIC
  207. ;
  208. bold: OBOLD ( text )+ CBOLD
  209. ;
  210. underline
  211. : OUNDER ( text )+ CUNDER
  212. ;
  213. strike
  214. : OSTRIKE ( text )+ CSTRIKE
  215. ;
  216. big : OBIG ( text )+ CBIG
  217. ;
  218. small
  219. : OSMALL ( text )+ CSMALL
  220. ;
  221. subscript
  222. : OSUB ( text )+ CSUB
  223. ;
  224. superscript
  225. : OSUP ( text )+ CSUP
  226. ;
  227. /*phrase elements*/
  228. emphasize
  229. : OEM ( text )+ CEM
  230. ;
  231. strong
  232. : OSTRONG ( text )+ CSTRONG
  233. ;
  234. definition
  235. : ODEF ( text )+ CDEF
  236. ;
  237. code
  238. : OCODE ( text )+ CCODE
  239. ;
  240. sample_output
  241. : OSAMP ( text )+ CSAMP
  242. ;
  243. keyboard_text
  244. : OKBD ( text )+ CKBD
  245. ;
  246. variable
  247. : OVAR ( text )+ CVAR
  248. ;
  249. citation
  250. : OCITE ( text )+ CCITE
  251. ;
  252. /* form fields (combined with body_content elsewhere so no PCDATA on end) */
  253. form_field
  254. : INPUT | select | textarea
  255. ;
  256. select
  257. : OSELECT (PCDATA)* (select_option)+ CSELECT
  258. ;
  259. select_option
  260. : SELOPT (PCDATA)*
  261. ;
  262. textarea
  263. : OTAREA (PCDATA)* CTAREA
  264. ;
  265. /* special text level elements*/
  266. anchor
  267. : OANCHOR (text)* CANCHOR
  268. ;
  269. applet
  270. : OAPPLET (APARM)? (PCDATA)* CAPPLET
  271. ;
  272. //not w3-no blocks allowed; www.microsoft.com uses
  273. font_dfn
  274. : OFONT (text)* CFONT
  275. ;
  276. map : OMAP (AREA)+ CMAP
  277. ;
  278. class HTMLLexer extends Lexer;
  279. options {
  280. k = 4;
  281. exportVocab=HTML;
  282. charVocabulary = '3'..'377';
  283. caseSensitive=false;
  284. filter=UNDEFINED_TOKEN;
  285. }
  286. /* STRUCTURAL tags
  287. */
  288. DOCTYPE 
  289. options {
  290. ignore=WS;
  291. }
  292. : "<!doctype" "html" "public" STRING '>'
  293. ;
  294. OHTML
  295.   :  "<html>"
  296. CHTML
  297. :  "</html>"
  298. ;
  299. OHEAD
  300. :  "<head>"
  301. ;
  302. CHEAD
  303. :  "</head>"
  304. ;
  305. OBODY
  306. : "<body" (WS (ATTR )*)? '>' 
  307. ;
  308. CBODY
  309. : "</body>"
  310. ;
  311. /* HEAD ELEMENTS
  312. */
  313. OTITLE
  314. : "<title>"
  315. ;
  316. CTITLE
  317. : "</title>"
  318. ;
  319. OSCRIPT
  320. :  "<script>" 
  321. ;
  322. CSCRIPT
  323. : "</script>"
  324. ;
  325. ISINDEX
  326.   :  "<isindex" WS ATTR '>'
  327. ;
  328. META
  329. :  "<meta" WS (ATTR)+ '>'
  330. ;
  331. LINK
  332. : "<link" WS (ATTR)+ '>'
  333. ;
  334. /* headings */
  335. OH1 : "<h1" (WS ATTR)? '>' 
  336. ;
  337. CH1 : "</h1>" 
  338. ;
  339. OH2 : "<h2" (WS ATTR)?'>' 
  340. ;
  341. CH2 : "</h2>" 
  342. ;
  343. OH3 : "<h3" (WS ATTR)? '>' 
  344. ;
  345. CH3 : "</h3>" 
  346. ;
  347. OH4 : "<h4" (WS ATTR)? '>' 
  348. ;
  349. CH4 : "</h4>" 
  350. ;
  351. OH5 : "<h5" (WS ATTR)? '>' 
  352. ;
  353. CH5 : "</h5>" 
  354. ;
  355. OH6 : "<h6" (WS ATTR)? '>' 
  356. ;
  357. CH6 : "</h6>" 
  358. ;
  359. OADDRESS
  360. : "<address>" 
  361. ;
  362. CADDRESS
  363. : "</address>"
  364. ;
  365. OPARA
  366. : "<p" (WS ATTR)? '>' 
  367. ;
  368. CPARA
  369. :  "</p>" //it's optional
  370. ;
  371. /*UNORDERED LIST*/
  372. OULIST
  373. : "<ul" (WS ATTR)? '>' 
  374. ;
  375. CULIST
  376. : "</ul>"
  377. ;
  378. /*ORDERED LIST*/
  379. OOLIST
  380. : "<ol" (WS ATTR)? '>'
  381. ;
  382. COLIST
  383. : "</ol>"
  384. ;
  385. /*LIST ITEM*/
  386. OLITEM
  387. : "<li" (WS ATTR)? '>'
  388. ;
  389. CLITEM
  390. : "</li>"
  391. ;
  392. /*DEFINITION LIST*/ 
  393. ODLIST 
  394. : "<dl" (WS ATTR)? '>' 
  395. ;
  396. CDLIST
  397. : "</dl>"
  398. ;
  399. ODTERM
  400. :  "<dt>"
  401. ;
  402. CDTERM
  403. :  "</dt>"
  404. ;
  405. ODDEF
  406. :  "<dd>"
  407. ;
  408. CDDEF
  409. :  "</dd>"
  410. ;
  411. ODIR: "<dir>"
  412. ;
  413. CDIR_OR_CDIV
  414. : "</di"
  415. ( 'r' {$setType(CDIR);}
  416. | 'v' {$setType(CDIV);}
  417. )
  418. '>'
  419. ;
  420. ODIV: "<div" (WS ATTR)? '>'
  421. ;
  422. OMENU
  423. : "<menu>"
  424. ;
  425. CMENU
  426. : "</menu>"
  427. ;
  428. OPRE: ("<pre>" | "<xmp>") ('n')? 
  429. ;
  430. CPRE:  "</pre>" | "</xmp>" 
  431. ;
  432. OCENTER
  433. : "<center>"
  434. ;
  435. CCENTER
  436. : "</center>"
  437. ;
  438. OBQUOTE
  439. : "<blockquote>"
  440. ;
  441. CBQUOTE
  442. : "</blockquote>"
  443. ;
  444. //this is block element and thus can't be nested inside of
  445. //other block elements, ex: paragraphs.
  446. //Netscape appears to generate bad HTML vis-a-vis the standard.
  447. HR : "<hr" (WS (ATTR)*)? '>'
  448. ;
  449. OTABLE
  450. : "<table" (WS (ATTR)*)? '>'
  451. ;
  452. CTABLE
  453. :  "</table>"
  454. ;
  455. OCAP: "<caption" (WS (ATTR)*)? '>'
  456. ;
  457. CCAP: "</caption>"
  458. ;
  459. O_TR
  460. : "<tr" (WS (ATTR)*)? '>'
  461. ;
  462. C_TR: "</tr>"
  463. ;
  464. O_TH_OR_TD
  465. : ("<th" | "<td") (WS (ATTR)*)? '>'
  466. ;
  467. C_TH_OR_TD
  468. : "</th>" | "</td>"
  469. ;
  470. /* PCDATA-LEVEL ELEMENTS
  471. */
  472. /* font style elemens*/
  473. OTTYPE
  474. : "<tt>"
  475. ;
  476. CTTYPE
  477. : "</tt>"
  478. ;
  479. OITALIC
  480. : "<i>"
  481. ;
  482. CITALIC
  483. : "</i>"
  484. ;
  485. OBOLD
  486.   : "<b>" 
  487. ;
  488. CBOLD
  489. : "</b>" 
  490. ;
  491. OUNDER
  492. : "<u>"
  493. ;
  494. CUNDER
  495. : "</u>" 
  496. ;
  497. /** Left-factor <strike> and <strong> to reduce lookahead */
  498. OSTRIKE_OR_OSTRONG
  499. : "<str"
  500. ( "ike" {$setType(OSTRIKE);}
  501. | "ong" {$setType(OSTRONG);}
  502. )
  503. '>'
  504. ;
  505. CST_LEFT_FACTORED
  506. : "</st"
  507. ( "rike" {$setType(CSTRIKE);}
  508. | "rong" {$setType(CSTRONG);}
  509. | "yle"  {$setType(CSTYLE);}
  510. )
  511. '>'
  512. ;
  513. OSTYLE
  514.   :  "<style>" 
  515. ;
  516. OBIG: "<big>"
  517. ;
  518. CBIG: "</big>"
  519. ;
  520. OSMALL
  521. : "<small>"
  522. ;
  523. CSMALL
  524. : "</small>"
  525. ;
  526. OSUB: "<sub>"
  527. ;
  528. OSUP: "<sup>"
  529. ;
  530. CSUB_OR_CSUP
  531. : "</su"
  532. ( 'b' {$setType(CSUB);}
  533. | 'p' {$setType(CSUP);}
  534. )
  535. '>'
  536. ;
  537. /* phrase elements*/
  538. OEM : "<em>"
  539. ;
  540. CEM : "</em>"
  541. ;
  542. ODFN: "<dfn>"
  543. ;
  544. CDFN: "</dfn>"
  545. ;
  546. OCODE
  547.   : "<code>" 
  548. ;
  549. CCODE
  550. : "</code>"
  551. ;
  552. OSAMP
  553. : "<samp>"
  554. ;
  555. CSAMP
  556. : "</samp>"
  557. ;
  558. OKBD: "<kbd>"
  559. ;
  560. CKBD: "</kbd>"
  561. ;
  562. OVAR: "<var>"
  563. ;
  564. CVAR: "</var>"
  565. ;
  566. OCITE
  567. : "<cite>"
  568. ;
  569. CCITE
  570. : "</cite>"
  571. ;
  572. /* form fields*/
  573. INPUT
  574. : "<input" (WS (ATTR)*)? '>'
  575. ;
  576. OSELECT
  577. : "<select" (WS (ATTR)*)? '>'
  578. ;
  579. CSELECT
  580. : "</select>"
  581. ;
  582. OTAREA
  583. : "<textarea" (WS (ATTR)*)? '>'
  584. ;
  585. CTAREA
  586. : "</textarea>"
  587. ;
  588. SELOPT
  589. : "<option" (WS (ATTR)*)? '>' 
  590. ;
  591. /* special text level elements*/
  592. OANCHOR
  593. : "<a" WS (ATTR)+ '>'
  594. ;
  595. CANCHOR
  596. : "</a>"
  597. ;
  598. IMG : "<img" WS (ATTR)+ '>'
  599. ;
  600. OAPPLET
  601. : "<applet" WS (ATTR)+ '>'
  602. ;
  603. APPLET
  604. : "</applet>"
  605. ;
  606. APARM
  607. : "<param" WS (ATTR)+'>'
  608. ;
  609. OFORM
  610. : "<form" WS (ATTR)+ '>'
  611. ;
  612. OFONT
  613. : "<font" WS (ATTR)+ '>'
  614. ;
  615. CFORM_OR_CFONT
  616. : "</fo"
  617. ( "rm" {$setType(CFORM);}
  618. | "nt" {$setType(CFONT);}
  619. )
  620. '>'
  621. ;
  622. /*
  623. CFORM
  624. : "</form>"
  625. ;
  626. CFONT
  627. : "</font>"
  628. ;
  629. */
  630. BFONT_OR_BASE
  631. : "<base"
  632. ( "font" WS ATTR {$setType(BFONT);}
  633. | WS ATTR        {$setType(BASE);}
  634. )
  635. '>'
  636. ;
  637. /*
  638. BFONT
  639. : "<basefont" WS ATTR '>'
  640. ;
  641. BASE:  "<base" WS ATTR '>'
  642. ;
  643. */
  644. BR
  645. : "<br" (WS ATTR)? '>'
  646. ;
  647. OMAP
  648. : "<map" WS ATTR '>'
  649. CMAP: "</map>"
  650. ;
  651. AREA: "<area" WS (ATTR)+ '>'
  652. ;
  653. /*MISC STUFF*/
  654. PCDATA
  655. : (
  656. /* See comment in WS.  Language for combining any flavor
  657.  * newline is ambiguous.  Shutting off the warning.
  658.  */
  659. options {
  660. generateAmbigWarnings=false;
  661. }
  662. : 'r' 'n' {newline();}
  663. | 'r' {newline();}
  664. | 'n' {newline();}
  665. | ~('<'|'n'|'r'|'"'|'>')
  666. )+ 
  667. ;
  668. // multiple-line comments
  669. protected
  670. COMMENT_DATA
  671. : ( /* 'r' 'n' can be matched in one alternative or by matching
  672. 'r' in one iteration and 'n' in another.  I am trying to
  673. handle any flavor of newline that comes in, but the language
  674. that allows both "rn" and "r" and "n" to all be valid
  675. newline is ambiguous.  Consequently, the resulting grammar
  676. must be ambiguous.  I'm shutting this warning off.
  677.  */
  678. options {
  679. generateAmbigWarnings=false;
  680. }
  681. :
  682. {LA(2)!='-' && LA(3)!='>'}? '-' // allow '-' if not "-->"
  683. | 'r' 'n' {newline();}
  684. | 'r' {newline();}
  685. | 'n' {newline();}
  686. | ~('-'|'n'|'r')
  687. )*
  688. ;
  689. COMMENT
  690. : "<!--" COMMENT_DATA "-->" { $setType(Token.SKIP); }
  691. ;
  692. /*
  693. PROTECTED LEXER RULES
  694. */
  695. protected
  696. WS : (
  697. /* 'r' 'n' can be matched in one alternative or by matching
  698. 'r' in one iteration and 'n' in another.  I am trying to
  699. handle any flavor of newline that comes in, but the language
  700. that allows both "rn" and "r" and "n" to all be valid
  701. newline is ambiguous.  Consequently, the resulting grammar
  702. must be ambiguous.  I'm shutting this warning off.
  703.  */
  704. options {
  705. generateAmbigWarnings=false;
  706. }
  707. : ' '
  708. | 't'
  709. | 'n' { newline(); }
  710. | "rn" { newline(); }
  711. | 'r' { newline(); }
  712. )+
  713. ;
  714. protected
  715. ATTR
  716. options {
  717. ignore=WS;
  718. }
  719. : WORD ('=' (WORD ('%')? | ('-')? INT | STRING | HEXNUM))?
  720. ;
  721. //don't need uppercase for case-insen.
  722. //the '.' is for words like "image.gif"
  723. protected
  724. WORD: ( LCLETTER
  725. | '.'
  726. )
  727. (
  728. /* In reality, a WORD must be followed by whitespace, '=', or
  729. what can follow an ATTR such as '>'.  In writing this grammar,
  730. however, we just list all the possibilities as optional
  731. elements.  This is loose, allowing the case where nothing is
  732. matched after a WORD and then the (ATTR)* loop means the
  733. grammar would allow "widthheight" as WORD WORD or WORD, hence,
  734. an ambiguity.  Naturally, ANTLR will consume the input as soon
  735. as possible, combing "widthheight" into one WORD.
  736. I am shutting off the ambiguity here because ANTLR does the
  737. right thing.  The exit path is ambiguous with ever
  738. alternative.  The only solution would be to write an unnatural
  739. grammar (lots of extra productions) that laid out the
  740. possibilities explicitly, preventing the bogus WORD followed
  741. immediately by WORD without whitespace etc...
  742.  */
  743. options {
  744. generateAmbigWarnings=false;
  745. }
  746. : LCLETTER
  747. | DIGIT
  748. | '.'
  749. )+
  750. ;
  751. protected
  752. STRING
  753. : '"' (~'"')* '"'
  754. | ''' (~''')* '''
  755. ;
  756. protected
  757. WSCHARS
  758. : ' ' | 't' | 'n' | 'r'
  759. ;
  760. protected 
  761. SPECIAL
  762. : '<' | '~'
  763. ;
  764. protected
  765. HEXNUM
  766. : '#' HEXINT
  767. ;
  768. protected
  769. INT : (DIGIT)+
  770. ;
  771. protected
  772. HEXINT
  773. : (
  774. /* Technically, HEXINT cannot be followed by a..f, but due to our
  775. loose grammar, the whitespace that normally would follow this
  776. rule is optional.  ANTLR reports that #4FACE could parse as
  777. HEXINT "#4" followed by WORD "FACE", which is clearly bogus.
  778. ANTLR does the right thing by consuming a much input as
  779. possible here.  I shut the warning off.
  780.  */
  781.  options {
  782. generateAmbigWarnings=false;
  783. }
  784. : HEXDIGIT
  785. )+
  786. ;
  787. protected
  788. DIGIT
  789. : '0'..'9'
  790. ;
  791. protected
  792. HEXDIGIT
  793. : '0'..'9'
  794. | 'a'..'f'
  795. ;
  796. protected
  797. LCLETTER
  798. : 'a'..'z'
  799. ;
  800. protected
  801. UNDEFINED_TOKEN
  802. : '<' (~'>')* '>'
  803. (
  804. ( /* the usual newline hassle: rn can be matched in alt 1
  805.  * or by matching alt 2 followed by alt 3 in another iteration.
  806.  */
  807.  options {
  808. generateAmbigWarnings=false;
  809. }
  810. : "rn" | 'r' | 'n'
  811. )
  812. { newline();}
  813. )*
  814. {System.err.println("invalid tag: "+$getText);}
  815. | ( "rn" | 'r' | 'n' ) {newline();}
  816. | .
  817. ;
  818. /*
  819. : ('<'  { System.err.print("Warning: non-standard tag <" + LA(1)); } )
  820. (~'>' { System.err.print(LA(1)); } )* 
  821. ('>'  { System.err.println(" skipped."); } ) 
  822. { _ttype = Token.SKIP; }
  823. ;
  824. */