/** XML parser by Oliver Zeigermann October 10, 2005 */ lexer grammar XML; DOCUMENT : XMLDECL? WS? DOCTYPE? WS? ELEMENT WS? ; DOCTYPE : '' ; INTERNAL_DTD : '[' (options {greedy=false;} : .)* ']' ; PI : '' ; XMLDECL : '' ; 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 : '' { System.out.println("End Tag: "+name.getText()); } ; COMMENT : '' ; CDATA : '' ; PCDATA : (~'<')+ ; VALUE : ( '\"' (~'\"')* '\"' | '\'' (~'\'')* '\'' ) ; GENERIC_ID : ( LETTER | '_' | ':') ( options {greedy=true;} : LETTER | '0'..'9' | '.' | '-' | '_' | ':' )* ; LETTER : 'a'..'z' | 'A'..'Z' ; fragment WS : ( ' ' | '\t' | ( '\n' | '\r\n' | '\r' ) )+ ;