forked from jasder/antlr
got core ^ and ! ops in
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8791]
This commit is contained in:
parent
15fbaccb6d
commit
2d5c4fd686
|
@ -1,6 +1,6 @@
|
||||||
parser grammar T;
|
parser grammar T;
|
||||||
options {output=AST;}
|
options {output=AST;}
|
||||||
a : A^ b ;
|
a : x+=A^ y+=b B! b!;
|
||||||
|
|
||||||
b : B ;
|
b : B ;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -104,17 +104,17 @@ public QStack\<<currentRule.ctxType>\> <currentRule.name>_stk = new QStack\<<cur
|
||||||
try {
|
try {
|
||||||
<code>
|
<code>
|
||||||
<postamble; separator="\n">
|
<postamble; separator="\n">
|
||||||
|
_localctx.stop = input.LT(-1);
|
||||||
|
<namedActions.after>
|
||||||
}
|
}
|
||||||
catch (RecognitionException re) {
|
catch (RecognitionException re) {
|
||||||
reportError(re);
|
reportError(re);
|
||||||
recover();
|
recover();
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
_localctx.stop = input.LT(-1);
|
|
||||||
<namedActions.after>
|
|
||||||
<currentRule.name>_stk.pop();
|
<currentRule.name>_stk.pop();
|
||||||
<finallyAction>
|
|
||||||
_ctx = (ParserRuleContext)_ctx.parent;
|
_ctx = (ParserRuleContext)_ctx.parent;
|
||||||
|
<finallyAction>
|
||||||
//System.out.println("exit "+ruleNames[<currentRule.index>]);
|
//System.out.println("exit "+ruleNames[<currentRule.index>]);
|
||||||
}
|
}
|
||||||
return _localctx;
|
return _localctx;
|
||||||
|
@ -266,12 +266,12 @@ cases(ttypes) ::= <<
|
||||||
>>
|
>>
|
||||||
|
|
||||||
InvokeRule(r) ::= <<
|
InvokeRule(r) ::= <<
|
||||||
_ctx.s = <r.stateNumber>;
|
_localctx.s = <r.stateNumber>;
|
||||||
<if(r.labels)><r.labels:{l | <labelref(l)> = }><endif><r.name>(<r.argExprs:{e| <e>}; separator=",">);
|
<if(r.labels)><r.labels:{l | <labelref(l)> = }><endif><r.name>(<r.argExprs:{e| <e>}; separator=",">);
|
||||||
>>
|
>>
|
||||||
|
|
||||||
MatchToken(m) ::= <<
|
MatchToken(m) ::= <<
|
||||||
_ctx.s = <m.stateNumber>;
|
_localctx.s = <m.stateNumber>;
|
||||||
<if(m.labels)><m.labels:{l | <labelref(l)> = }>(Token)<endif>match(<m.name>);
|
<if(m.labels)><m.labels:{l | <labelref(l)> = }>(Token)<endif>match(<m.name>);
|
||||||
>>
|
>>
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ SetDynScopeAttr_negIndex(s, indexChunks, rhsChunks) ::=
|
||||||
SetDynScopeAttr_index(s, indexChunks, rhsChunks) ::=
|
SetDynScopeAttr_index(s, indexChunks, rhsChunks) ::=
|
||||||
"<s.scope>.get(<indexChunks>).<s.attr> =<rhsChunks>;"
|
"<s.scope>.get(<indexChunks>).<s.attr> =<rhsChunks>;"
|
||||||
|
|
||||||
AddToLabelList(a) ::= "_localctx.<a.listName>.add(_localctx.<first(a.opWithResultToAdd.labels)>);"
|
AddToLabelList(a) ::= "_localctx.<a.listName>.add(<labelref(first(a.opWithResultToAdd.labels))>);"
|
||||||
|
|
||||||
TokenDecl(t) ::= "Token <t.name>;"
|
TokenDecl(t) ::= "Token <t.name>;"
|
||||||
TokenTypeDecl(t) ::= "int <t.name>;"
|
TokenTypeDecl(t) ::= "int <t.name>;"
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
package org.antlr.v4.codegen;
|
package org.antlr.v4.codegen;
|
||||||
|
|
||||||
|
import org.antlr.runtime.tree.Tree;
|
||||||
import org.antlr.v4.codegen.model.*;
|
import org.antlr.v4.codegen.model.*;
|
||||||
import org.antlr.v4.codegen.model.ast.*;
|
import org.antlr.v4.codegen.model.ast.*;
|
||||||
import org.antlr.v4.misc.Utils;
|
import org.antlr.v4.misc.Utils;
|
||||||
|
import org.antlr.v4.parse.ANTLRParser;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -18,15 +20,33 @@ public class ParserASTExtension extends CodeGeneratorExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SrcOp> ruleRef(List<SrcOp> ops) {
|
public List<SrcOp> rootRule(List<SrcOp> ops) {
|
||||||
InvokeRule invokeOp = (InvokeRule)Utils.find(ops, InvokeRule.class);
|
InvokeRule invokeOp = (InvokeRule)Utils.find(ops, InvokeRule.class);
|
||||||
SrcOp treeOp = new BecomeRoot(factory, invokeOp.ast, invokeOp);
|
SrcOp treeOp = new BecomeRoot(factory, invokeOp.ast, invokeOp);
|
||||||
return DefaultOutputModelFactory.list(ops, treeOp);
|
return DefaultOutputModelFactory.list(ops, treeOp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SrcOp> rootToken(List<SrcOp> ops) {
|
||||||
|
MatchToken matchOp = (MatchToken)Utils.find(ops, MatchToken.class);
|
||||||
|
SrcOp treeOp = new BecomeRoot(factory, matchOp.ast, matchOp);
|
||||||
|
return DefaultOutputModelFactory.list(ops, treeOp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SrcOp> ruleRef(List<SrcOp> ops) {
|
||||||
|
InvokeRule invokeOp = (InvokeRule)Utils.find(ops, InvokeRule.class);
|
||||||
|
Tree parent = invokeOp.ast.getParent();
|
||||||
|
if ( parent!=null && parent.getType()==ANTLRParser.BANG ) return ops;
|
||||||
|
SrcOp treeOp = new AddLeaf(factory, invokeOp.ast, invokeOp);
|
||||||
|
return DefaultOutputModelFactory.list(ops, treeOp);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SrcOp> tokenRef(List<SrcOp> ops) {
|
public List<SrcOp> tokenRef(List<SrcOp> ops) {
|
||||||
MatchToken matchOp = (MatchToken)Utils.find(ops, MatchToken.class);
|
MatchToken matchOp = (MatchToken)Utils.find(ops, MatchToken.class);
|
||||||
|
Tree parent = matchOp.ast.getParent();
|
||||||
|
if ( parent!=null && parent.getType()==ANTLRParser.BANG ) return ops;
|
||||||
SrcOp treeOp = new AddLeaf(factory, matchOp.ast, matchOp);
|
SrcOp treeOp = new AddLeaf(factory, matchOp.ast, matchOp);
|
||||||
return DefaultOutputModelFactory.list(ops, treeOp);
|
return DefaultOutputModelFactory.list(ops, treeOp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue