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

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


I forgot to put sample input 
here it is:


--------------------------------------------------------------------------------------------------------------------------------
 , \ some text
[#list]
${first} < ${edition} , ${channel}
[#save filename="fname" template="templ" /]
[/#list]
 , \ some text
--------------------------------------------------------------------------------------------------------------------------------
-------- Пересылаемое сообщение --------
24.05.10, 12:44, "Ламер" <Gogi66 at yandex.ru>:

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:
--------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------
-------- Завершение пересылаемого сообщения --------


-- 
Яндекс.Почта. Письма есть. Спама - нет. http://mail.yandex.ru/nospam/sign


More information about the antlr-interest mailing list