got A b C -> ^(A b C) working :)

[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8824]
This commit is contained in:
parrt 2011-07-03 12:18:47 -08:00
parent 3cfbe39b4f
commit d33b3a4a62
12 changed files with 201 additions and 31 deletions

View File

@ -1,7 +1,7 @@
grammar T;
options {output=AST;}
tokens {I;}
a : A b ';' -> A b ';' ;
a : A b C -> ^(A b C) ;
b : B ;
@ -9,6 +9,7 @@ A : 'a';
B : 'b';
C : 'c';
D : 'd';
SEMI : ';';
WS : ' '|'\t'|'\n' {skip();} ;
/*

View File

@ -376,7 +376,7 @@ _adaptor.setTokenBoundaries(_localctx.tree, _localctx.start, _localctx.stop);
ElementListDecl(d) ::= "List\<Object> <d.name> = _adaptor.createElementList();"
ElementListName(elemName) ::= "_track_<elemName>"
TrackRuleElement(e) ::= "<e.name>.add(<labelref(e.label)>);"
TrackRuleElement(e) ::= "<e.name>.add(<labelref(e.label)>.tree);"
TrackTokenElement(e) ::= "<e.name>.add(_adaptor.create(<labelref(e.label)>));"
TreeRewrite(tr, locals, preamble, ops) ::= <<
@ -384,12 +384,23 @@ TreeRewrite(tr, locals, preamble, ops) ::= <<
<CodeBlockForAlt(tr, locals, preamble, ops)>
>>
RewriteTreeStructure(t, ops) ::= <<
<ops; separator="\n">
>>
RewriteIteratorDecl(d) ::= "Iterator <d.name>;"
RewriteIteratorInit(i) ::= "<i.decl.name> = <i.decl.listName>.iterator();"
RewriteIteratorName(elemName,level) ::= "it<level>_<elemName>"
RewriteTokenRef(t) ::= "_adaptor.addChild(<t.enclosingBlock.rootDecl.name>, <t.decl.name>.next());"
RewriteRuleRef(r) ::= "/* ruleref */"
RewriteTokenRefIsRoot(t) ::= <%
<labelref(t.enclosingBlock.rootDecl)> =
_adaptor.becomeRoot(<t.decl.name>.next(), <labelref(t.enclosingBlock.rootDecl)>);
%>
RewriteRuleRef(r) ::= "_adaptor.addChild(<r.enclosingBlock.rootDecl.name>, <r.decl.name>.next());"
RewriteRuleRefIsRoot(r) ::= <%
<labelref(r.enclosingBlock.rootDecl)> =
_adaptor.becomeRoot(<r.decl.name>.next(), <labelref(r.enclosingBlock.rootDecl)>);
%>
/*
BitSetDecl(b) ::= <<

View File

@ -79,11 +79,13 @@ public abstract class BlankOutputModelFactory implements OutputModelFactory {
public TreeRewrite treeRewrite(GrammarAST ast, int rewriteLevel) { return null; }
public List<SrcOp> rewrite_ruleRef(GrammarAST ID) { return null; }
public List<SrcOp> rewrite_tree(GrammarAST root, List<SrcOp> ops) { return null; }
public List<SrcOp> rewrite_tokenRef(GrammarAST ID) { return null; }
public List<SrcOp> rewrite_ruleRef(GrammarAST ID, boolean isRoot) { return null; }
public List<SrcOp> rewrite_stringRef(GrammarAST ID) { return rewrite_tokenRef(ID); }
public List<SrcOp> rewrite_tokenRef(GrammarAST ID, boolean isRoot) { return null; }
public List<SrcOp> rewrite_stringRef(GrammarAST ID, boolean isRoot) { return rewrite_tokenRef(ID, isRoot); }
// BLOCKS

View File

@ -89,6 +89,8 @@ public class CodeGeneratorExtension {
public TreeRewrite treeRewrite(TreeRewrite r) { return r; }
public List<SrcOp> rewrite_tree(List<SrcOp> ops) { return ops; }
public List<SrcOp> rewrite_ruleRef(List<SrcOp> ops) { return ops; }
public List<SrcOp> rewrite_tokenRef(List<SrcOp> ops) { return ops; }

View File

@ -278,19 +278,25 @@ public class OutputModelController implements OutputModelFactory {
return r;
}
public List<SrcOp> rewrite_ruleRef(GrammarAST ID) {
List<SrcOp> ops = delegate.rewrite_ruleRef(ID);
public List<SrcOp> rewrite_tree(GrammarAST root, List<SrcOp> ops) {
ops = delegate.rewrite_tree(root, ops);
for (CodeGeneratorExtension ext : extensions) ops = ext.rewrite_tree(ops);
return ops;
}
public List<SrcOp> rewrite_ruleRef(GrammarAST ID, boolean isRoot) {
List<SrcOp> ops = delegate.rewrite_ruleRef(ID, isRoot);
for (CodeGeneratorExtension ext : extensions) ops = ext.rewrite_ruleRef(ops);
return ops;
}
public List<SrcOp> rewrite_tokenRef(GrammarAST ID) {
List<SrcOp> ops = delegate.rewrite_tokenRef(ID);
public List<SrcOp> rewrite_tokenRef(GrammarAST ID, boolean isRoot) {
List<SrcOp> ops = delegate.rewrite_tokenRef(ID, isRoot);
for (CodeGeneratorExtension ext : extensions) ops = ext.rewrite_tokenRef(ops);
return ops;
}
public List<SrcOp> rewrite_stringRef(GrammarAST ID) { return rewrite_tokenRef(ID); }
public List<SrcOp> rewrite_stringRef(GrammarAST ID, boolean isRoot) { return rewrite_tokenRef(ID, isRoot); }
public OutputModelObject getRoot() { return delegate.getRoot(); }

View File

@ -98,11 +98,13 @@ public interface OutputModelFactory {
TreeRewrite treeRewrite(GrammarAST ast, int rewriteLevel);
List<SrcOp> rewrite_ruleRef(GrammarAST ID);
List<SrcOp> rewrite_tree(GrammarAST root, List<SrcOp> ops);
List<SrcOp> rewrite_tokenRef(GrammarAST ID);
List<SrcOp> rewrite_ruleRef(GrammarAST ID, boolean isRoot);
List<SrcOp> rewrite_stringRef(GrammarAST ID);
List<SrcOp> rewrite_tokenRef(GrammarAST ID, boolean isRoot);
List<SrcOp> rewrite_stringRef(GrammarAST ID, boolean isRoot);
// CONTEXT MANIPULATION

View File

@ -176,20 +176,31 @@ public class ParserFactory extends DefaultOutputModelFactory {
return new TreeRewrite(this, rewriteLevel);
}
public List<SrcOp> rewrite_ruleRef(GrammarAST ID) {
RewriteIteratorDecl d = new RewriteIteratorDecl(this, ID, 0);
getCurrentBlock().addLocalDecl(d);
RewriteIteratorInit init = new RewriteIteratorInit(this, d);
getCurrentBlock().addPreambleOp(init);
return list(new RewriteRuleRef(this, ID));
@Override
public List<SrcOp> rewrite_tree(GrammarAST root, List<SrcOp> ops) {
return list(new RewriteTreeStructure(this, root, ops));
}
public List<SrcOp> rewrite_tokenRef(GrammarAST ID) {
public List<SrcOp> rewrite_ruleRef(GrammarAST ID, boolean isRoot) {
RewriteIteratorDecl d = new RewriteIteratorDecl(this, ID, 0);
getCurrentBlock().addLocalDecl(d);
RewriteIteratorInit init = new RewriteIteratorInit(this, d);
getCurrentBlock().addPreambleOp(init);
return list(new RewriteTokenRef(this, ID, d));
RewriteRuleRef ruleRef;
if ( isRoot ) ruleRef = new RewriteRuleRefIsRoot(this, ID, d);
else ruleRef = new RewriteRuleRef(this, ID, d);
return list(ruleRef);
}
public List<SrcOp> rewrite_tokenRef(GrammarAST ID, boolean isRoot) {
RewriteIteratorDecl d = new RewriteIteratorDecl(this, ID, 0);
getCurrentBlock().addLocalDecl(d);
RewriteIteratorInit init = new RewriteIteratorInit(this, d);
getCurrentBlock().addPreambleOp(init);
RewriteTokenRef tokenRef;
if ( isRoot ) tokenRef = new RewriteTokenRefIsRoot(this, ID, d);
else tokenRef = new RewriteTokenRef(this, ID, d);
return list(tokenRef);
}
// support

View File

@ -63,7 +63,7 @@ alternative returns [CodeBlockForAlt altCodeBlock]
$altCodeBlock = factory.alternative(factory.getCurrentAlt());
factory.setCurrentBlock($altCodeBlock);
}
^( ALT ( element {if ($element.omos!=null) elems.addAll($element.omos);} )+ )
^( ALT ( element {if ($element.omos!=null) elems.addAll($element.omos);} )+ )
{$altCodeBlock.ops = elems;}
;
@ -190,19 +190,19 @@ rewriteTreeAlt returns [List<SrcOp> omos]
;
rewriteTreeElement returns [List<SrcOp> omos]
: rewriteTreeAtom {$omos = $rewriteTreeAtom.omos;}
: rewriteTreeAtom[false] {$omos = $rewriteTreeAtom.omos;}
| rewriteTree {$omos = $rewriteTree.omos;}
| rewriteTreeEbnf {$omos = $rewriteTreeEbnf.omos;}
;
rewriteTreeAtom returns [List<SrcOp> omos]
rewriteTreeAtom[boolean isRoot] returns [List<SrcOp> omos]
: ^(TOKEN_REF elementOptions ARG_ACTION)
| ^(TOKEN_REF elementOptions)
| ^(TOKEN_REF ARG_ACTION)
| TOKEN_REF {$omos = factory.rewrite_tokenRef($TOKEN_REF);}
| RULE_REF {$omos = factory.rewrite_ruleRef($RULE_REF);}
| ^(STRING_LITERAL elementOptions) {$omos = factory.rewrite_stringRef($STRING_LITERAL);}
| STRING_LITERAL {$omos = factory.rewrite_stringRef($STRING_LITERAL);}
| TOKEN_REF {$omos = factory.rewrite_tokenRef($TOKEN_REF, $isRoot);}
| RULE_REF {$omos = factory.rewrite_ruleRef($RULE_REF, $isRoot);}
| ^(STRING_LITERAL elementOptions) {$omos = factory.rewrite_stringRef($STRING_LITERAL, $isRoot);}
| STRING_LITERAL {$omos = factory.rewrite_stringRef($STRING_LITERAL, $isRoot);}
| LABEL
| ACTION
;
@ -213,7 +213,12 @@ rewriteTreeEbnf returns [List<SrcOp> omos]
;
rewriteTree returns [List<SrcOp> omos]
: ^(TREE_BEGIN rewriteTreeAtom rewriteTreeElement* )
: {List<SrcOp> elems = new ArrayList<SrcOp>();}
^( TREE_BEGIN
rewriteTreeAtom[true] {elems.addAll($rewriteTreeAtom.omos);}
( rewriteTreeElement {elems.addAll($rewriteTreeElement.omos);} )*
)
{$omos = factory.rewrite_tree($TREE_BEGIN, elems);}
;
rewriteSTAlt returns [List<SrcOp> omos]

View File

@ -31,10 +31,14 @@ package org.antlr.v4.codegen.model.ast;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.codegen.model.SrcOp;
import org.antlr.v4.codegen.model.decl.RewriteIteratorDecl;
import org.antlr.v4.tool.GrammarAST;
public class RewriteRuleRef extends SrcOp {
public RewriteRuleRef(OutputModelFactory factory, GrammarAST ast) {
/** Which iterator decl are we associated with? */
public RewriteIteratorDecl decl;
public RewriteRuleRef(OutputModelFactory factory, GrammarAST ast, RewriteIteratorDecl decl) {
super(factory, ast);
this.decl = decl;
}
}

View File

@ -0,0 +1,40 @@
/*
[The "BSD license"]
Copyright (c) 2011 Terence Parr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.v4.codegen.model.ast;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.codegen.model.decl.RewriteIteratorDecl;
import org.antlr.v4.tool.GrammarAST;
public class RewriteRuleRefIsRoot extends RewriteRuleRef {
public RewriteRuleRefIsRoot(OutputModelFactory factory, GrammarAST ast, RewriteIteratorDecl decl) {
super(factory, ast, decl);
}
}

View File

@ -0,0 +1,40 @@
/*
[The "BSD license"]
Copyright (c) 2011 Terence Parr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.v4.codegen.model.ast;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.codegen.model.decl.RewriteIteratorDecl;
import org.antlr.v4.tool.GrammarAST;
public class RewriteTokenRefIsRoot extends RewriteTokenRef {
public RewriteTokenRefIsRoot(OutputModelFactory factory, GrammarAST ast, RewriteIteratorDecl decl) {
super(factory, ast, decl);
}
}

View File

@ -0,0 +1,46 @@
/*
[The "BSD license"]
Copyright (c) 2011 Terence Parr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.v4.codegen.model.ast;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.codegen.model.*;
import org.antlr.v4.tool.GrammarAST;
import java.util.List;
/** ^(A B C) */
public class RewriteTreeStructure extends SrcOp {
@ModelElement public List<? extends SrcOp> ops;
public RewriteTreeStructure(OutputModelFactory factory, GrammarAST ast, List<? extends SrcOp> ops) {
super(factory, ast);
this.ops = ops;
}
}