forked from jasder/antlr
got A b C -> ^(A b C) working :)
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8824]
This commit is contained in:
parent
3cfbe39b4f
commit
d33b3a4a62
|
@ -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();} ;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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) ::= <<
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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(); }
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue