rendered paste body/** XML parser by Oliver Zeigermann October 10, 2005 */
lexer grammar XML;
DOCUMENT
: XMLDECL? WS? DOCTYPE? WS? ELEMENT WS?
;
DOCTYPE
:
'<!DOCTYPE' WS rootElementName=GENERIC_ID
{ System.out.println("ROOTELEMENT: "+rootElementName.getText()); }
WS
(
( 'SYSTEM' WS sys1=VALUE
{ System.out.println("SYSTEM: "+sys1.getText()); }
| 'PUBLIC' WS pub=VALUE WS sys2=VALUE
{ System.out.println("PUBLIC: "+pub.getText()); }
{ System.out.println("SYSTEM: "+sys2.getText()); }
)
( WS )?
)?
( dtd=INTERNAL_DTD
{ System.out.println("INTERNAL DTD: "+dtd.getText()); }
)?
'>'
;
INTERNAL_DTD : '[' (options {greedy=false;} : .)* ']' ;
PI :
'<?' target=GENERIC_ID WS?
{ System.out.println("PI: "+target.getText()); }
( ATTRIBUTE WS? )* '?>'
;
XMLDECL :
'<?' ('x'|'X') ('m'|'M') ('l'|'L') WS?
{ System.out.println("XML declaration"); }
( ATTRIBUTE WS? )* '?>'
;
ELEMENT
: ( START_TAG
(ELEMENT
| t=PCDATA
{ System.out.println("PCDATA: \""+$t.getText()+"\""); }
| t=CDATA
{ System.out.println("CDATA: \""+$t.getText()+"\""); }
| t=COMMENT
{ System.out.println("Comment: \""+$t.getText()+"\""); }
| pi=PI
)*
END_TAG
| EMPTY_ELEMENT
)
;
START_TAG
: '<' WS? name=GENERIC_ID WS?
{ System.out.println("Start Tag: "+name.getText()); }
( ATTRIBUTE WS? )* '>'
;
EMPTY_ELEMENT
: '<' WS? name=GENERIC_ID WS?
{ System.out.println("Empty Element: "+name.getText()); }
( ATTRIBUTE WS? )* '/>'
;
ATTRIBUTE
: name=GENERIC_ID WS? '=' WS? value=VALUE
{ System.out.println("Attr: "+name.getText()+"="+value.getText()); }
;
END_TAG
: '</' WS? name=GENERIC_ID WS? '>'
{ System.out.println("End Tag: "+name.getText()); }
;
COMMENT
: '<!--' (options {greedy=false;} : .)* '-->'
;
CDATA
: '<![CDATA[' (options {greedy=false;} : .)* ']]>'
;
PCDATA : (~'<')+ ;
VALUE :
( '\"' (~'\"')* '\"'
| '\'' (~'\'')* '\''
)
;
GENERIC_ID
: ( LETTER | '_' | ':')
( options {greedy=true;} : LETTER | '0'..'9' | '.' | '-' | '_' | ':' )*
;
LETTER
: 'a'..'z'
| 'A'..'Z'
;
fragment WS :
( ' '
| '\t'
| ( '\n'
| '\r\n'
| '\r'
)
)+
;