[antlr-interest] ClassCastException in TreeParser grammar

Ламер Gogi66 at yandex.ru
Mon May 24 23:44:45 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.

<b>Combined grammar:</b>
<font size=2>
<pre>
--------------------------------------------------------------------------------------------------------------------------------
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()) + "\""; }
	;
</pre>
<font>

<b>And here is TreeParser grammar:</b>
--------------------------------------------------------------------------------------------------------------------------------
<font size=2>
<pre>
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)
	;
</pre>
</font>


sample input 
here it is:
--------------------------------------------------------------------------------------------------------------------------------
 , \ some text
[#list]
${first} < ${edition} , ${channel}
[#save filename="fname" template="templ" /]
[/#list]
 , \ some text
--------------------------------------------------------------------------------------------------------------------------------


More information about the antlr-interest mailing list