[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