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

编译器/解释器

开发平台:

Others

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