[antlr-interest] [Antlr][Java] Possible bug: Incorrect codegen when rewriting w/ code blocks attached.
Austin Hastings
Austin_Hastings at Yahoo.com
Mon Sep 8 22:00:47 PDT 2008
I'm parsing a C-like language in Java, and stumbled across this ANTLR
source:
decl_prefix
: '*' tql=type_qualifier_list -> ^('*'
$tql)
{
$declarator::type =
typeFactory.getPointerToType($declarator::type, $tql.list);
}
;
which generated the incorrect Java below. It is trying to use a java
statement (terminated with ';') as a parameter to addChild. I'm not
clear why - the code block should probably just be left alone, no?
I have found that relocating the code block to before the rewrite rule
seems to generate correct output. I didn't notice any kind of diagnostic
being emitted, though it may have been consumed by Eclipse.
=Austin
public static class decl_prefix_return extends ParserRuleReturnScope {
CommonTree tree;
public Object getTree() { return tree; }
};
// $ANTLR start "decl_prefix"
// D:\\My Documents\\My Eclipse
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:400:1:
decl_prefix : '*' tql= type_qualifier_list -> ^( '*' $tql) ;
public final HlasmParser.decl_prefix_return decl_prefix() throws
RecognitionException {
HlasmParser.decl_prefix_return retval = new
HlasmParser.decl_prefix_return();
retval.start = input.LT(1);
CommonTree root_0 = null;
Token char_literal36=null;
HlasmParser.type_qualifier_list_return tql = null;
CommonTree char_literal36_tree=null;
RewriteRuleTokenStream stream_67=new
RewriteRuleTokenStream(adaptor,"token 67");
RewriteRuleSubtreeStream stream_type_qualifier_list=new
RewriteRuleSubtreeStream(adaptor,"rule type_qualifier_list");
try {
// D:\\My Documents\\My Eclipse
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:2: ( '*'
tql= type_qualifier_list -> ^( '*' $tql) )
// D:\\My Documents\\My Eclipse
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:4: '*'
tql= type_qualifier_list
{
char_literal36=(Token)match(input,67,FOLLOW_67_in_decl_prefix992); if
(state.failed) return retval;
if ( state.backtracking==0 ) stream_67.add(char_literal36);
pushFollow(FOLLOW_type_qualifier_list_in_decl_prefix996);
tql=type_qualifier_list();
state._fsp--;
if (state.failed) return retval;
if ( state.backtracking==0 )
stream_type_qualifier_list.add(tql.getTree());
// AST REWRITE
// elements: tql, 67
// token labels:
// rule labels: retval, tql
// token list labels:
// rule list labels:
if ( state.backtracking==0 ) {
retval.tree = root_0;
RewriteRuleSubtreeStream stream_retval=new
RewriteRuleSubtreeStream(adaptor,"token
retval",retval!=null?retval.tree:null);
RewriteRuleSubtreeStream stream_tql=new
RewriteRuleSubtreeStream(adaptor,"token tql",tql!=null?tql.tree:null);
root_0 = (CommonTree)adaptor.nil();
// 401:36: -> ^( '*' $tql)
{
// D:\\My Documents\\My Eclipse
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:39: ^(
'*' $tql)
{
CommonTree root_1 = (CommonTree)adaptor.nil();
root_1 =
(CommonTree)adaptor.becomeRoot(stream_67.nextNode(), root_1);
adaptor.addChild(root_1, stream_tql.nextTree());
adaptor.addChild(root_0, root_1);
}
adaptor.addChild(root_0,
((declarator_scope)declarator_stack.peek()).type =
typeFactory.getPointerToType(((declarator_scope)declarator_stack.peek()).type,
(tql!=null?tql.list:null));
);
////// ************************************
///// BAD CODE ABOVE: See ';' at end of line inside
adaptor.addChild(root_0, ...);
////// ************************************
}
retval.tree = root_0;}
}
retval.stop = input.LT(-1);
if ( state.backtracking==0 ) {
retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
adaptor.setTokenBoundaries(retval.tree, retval.start,
retval.stop);
}
}
catch (RecognitionException re) {
reportError(re);
recover(input,re);
retval.tree = (CommonTree)adaptor.errorNode(input, retval.start,
input.LT(-1), re);
}
finally {
}
return retval;
}
// $ANTLR end "decl_prefix"
More information about the antlr-interest
mailing list