[antlr-interest] Please, help to write a tree walker

Ламер Gogi66 at yandex.ru
Mon May 24 01:44:36 PDT 2010


Hi, can you help me to write Tree grammar.
ClassCastException is thrown while my Test runs.
Here is the code of Combined grammar and Tree grammar that doesn't work.

Combined grammar:
--------------------------------------------------------------------------------------------------------------------------------
grammar MetaDataExtractor;

options {
  language = Java;
  output = AST;
  ASTLabelType = CommonTree;
}

tokens {
  TOKEN;
  VAR;
  CR;
  SAVE;
  NEWLINE;
  LIST;
}


/* PARSER RULES */

template
	:	operator*
		list
		operator*
		EOF!
	;

list
	:	l='[#list]'
			operator*
			save
		'[/#list]'
		-> ^(LIST[$l, "LIST"] operator* save)
	;

operator
	:	token
	|	variable
	|	cr
	;

token
	:	(	t=WORD
		|	t=NUMBER
		|	t=ID
		|	t=SYMBOL
		|	t=STRING_LITERAL
		) -> ^(TOKEN $t)
	;

variable
	:	VARIABLE -> ^(VAR VARIABLE)
	;

cr
	:	'[#cr/]' -> ^(CR NEWLINE)
	;

save
	:	'[#save'
			'filename=' fname=STRING_LITERAL
			'template=' tpath=STRING_LITERAL
		'/]'
		-> ^(SAVE $fname $tpath)
	;



/* LEXER RULES*/

fragment LETTER : ('a'..'z' | 'A'..'Z') ;

fragment DIGIT : '0'..'9' ;

NUMBER : DIGIT+ ;

WORD : LETTER+ ;

ID : LETTER (LETTER | DIGIT)+ ;

SYMBOL : '!' | '#'..'/' | ':'..'@' | '['..'`' | '{'..'~' ;	// without quote
//SYMBOL : '!'..'/' | ':'..'@' | '['..'`' | '{'..'~' ;		// with quote

VARIABLE : '${' WORD '}' ;

WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;} ;

MULTILINE_COMMENT : '[#--' .* '--]' {$channel = HIDDEN;} ;

STRING_LITERAL
	:	'"'
		{ StringBuilder b = new StringBuilder(); }
		(	c=~('"' | '\r' | '\n'/* | VARIABLE*/)	{ b.appendCodePoint(c); }
		)*
		'"'
		{ "\"" +setText(b.toString()) + "\""; }
	;

--------------------------------------------------------------------------------------------------------------------------------
tree grammar MetaDataExtractorWalker;

options {
  language = Java;
  tokenVocab = MetaDataExtractor;
  ASTLabelType = CommonTree;
}


// COPIED FROM PARSER
template
	:	operator*
		list
		operator*

	;

list
	:	^(LIST operator* save)
	;

operator
	:	token
	|	variable
	|	cr
	;

token
	:	^(TOKEN WORD)
	|	^(TOKEN NUMBER)
	|	^(TOKEN ID)
	|	^(TOKEN SYMBOL)
	|	^(TOKEN STRING_LITERAL)
	;

variable
	:	(VAR VARIABLE)
	;

cr
	:	^(CR NEWLINE)
	;

save
	:	^(SAVE STRING_LITERAL STRING_LITERAL)
	;

And here is TreeParser grammar:
--------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------


More information about the antlr-interest mailing list