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

编译器/解释器

开发平台:

Others

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