Skip to content

Commit

Permalink
v3: Fix labels in synpreds
Browse files Browse the repository at this point in the history
[git-p4: depot-paths = "//depot/code/antlr/antlr3-main/": change = 9219]
  • Loading branch information
sharwell committed Oct 27, 2011
1 parent 1d4835f commit db6adae
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 4 deletions.
3 changes: 3 additions & 0 deletions tool/CHANGES.txt
Expand Up @@ -10,6 +10,9 @@ CHANGES
October 25, 2011

* (Sam) Rule.setOption didn't do memoize option right.
* (Sam) Fix labels in synpreds
* (Sam) Fix input index for NoViableAltException during inline prediction
* (Sam) Fix label aliasing errors in cases like (x=y|x=z)

August 10, 2011

Expand Down
Expand Up @@ -410,7 +410,7 @@ rule returns [ST code=null]
// For syn preds, we don't want any AST code etc... in there.
// Save old templates ptr and restore later. Base templates include Dbg.
STGroup saveGroup = templates;
if ( ruleDescr.isSynPred )
if ( ruleDescr.isSynPred && generator.target.useBaseTemplatesForSynPredFragments() )
{
templates = generator.getBaseTemplates();
}
Expand Down
5 changes: 5 additions & 0 deletions tool/src/main/java/org/antlr/codegen/CSharp3Target.java
Expand Up @@ -68,6 +68,11 @@ public class CSharp3Target extends Target {
add("enum"); add("namespace"); add("string");
}};

@Override
public boolean useBaseTemplatesForSynPredFragments() {
return false;
}

@Override
public String encodeIntAsCharEscape(int v) {
return "\\x" + Integer.toHexString(v).toUpperCase();
Expand Down
5 changes: 5 additions & 0 deletions tool/src/main/java/org/antlr/codegen/JavaTarget.java
Expand Up @@ -35,6 +35,11 @@
import java.util.Set;

public class JavaTarget extends Target {
@Override
public boolean useBaseTemplatesForSynPredFragments() {
return false;
}

protected ST chooseWhereCyclicDFAsGo(Tool tool,
CodeGenerator generator,
Grammar grammar,
Expand Down
4 changes: 4 additions & 0 deletions tool/src/main/java/org/antlr/codegen/Target.java
Expand Up @@ -83,6 +83,10 @@ public Target() {
targetCharValueEscape['"'] = "\\\"";
}

public boolean useBaseTemplatesForSynPredFragments() {
return true;
}

protected void genRecognizerFile(Tool tool,
CodeGenerator generator,
Grammar grammar,
Expand Down
Expand Up @@ -63,6 +63,7 @@ ruleDeclarations() ::= <<

ruleLabelDefs() ::= <<
<super.ruleLabelDefs()>
<if(!ruleDescriptor.isSynPred)>
<[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,
ruleDescriptor.wildcardTreeListLabels]:{it | <ASTLabelType> <it.label.text>_tree=null;}; separator="\n">
<ruleDescriptor.tokenListLabels:{it | <ASTLabelType> <it.label.text>_tree=null;}; separator="\n">
Expand All @@ -77,6 +78,7 @@ ruleLabelDefs() ::= <<
<ruleDescriptor.allRuleRefsInAltsWithRewrites
:{it | RewriteRuleSubtreeStream stream_<it>=new RewriteRuleSubtreeStream(adaptor,"rule <it>");}; separator="\n">
<endif>
<endif>
>>

/** When doing auto AST construction, we must define some variables;
Expand All @@ -87,7 +89,7 @@ ruleLabelDefs() ::= <<
@alt.declarations() ::= <<
<if(autoAST)>
<if(outerAlt)>
<if(!rewriteMode)>
<if(!rewriteMode && !ruleDescriptor.isSynPred)>
root_0 = (<ASTLabelType>)adaptor.nil();<\n>
<endif>
<endif>
Expand Down
Expand Up @@ -48,10 +48,12 @@ retval.tree = (<ASTLabelType>)adaptor.errorNode(input, retval.start, input.LT(-1
/** ID and output=AST */
tokenRef(token,label,elementIndex,terminalOptions) ::= <<
<super.tokenRef(...)>
<if(!ruleDescriptor.isSynPred)>
<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
<label>_tree = <createNodeFromToken(...)>;
adaptor.addChild(root_0, <label>_tree);
<if(backtracking)>}<endif>
<endif>
>>

/** ID! and output=AST (same as plain tokenRef) */
Expand All @@ -60,10 +62,12 @@ tokenRefBang(token,label,elementIndex,terminalOptions) ::= "<super.tokenRef(...)
/** ID^ and output=AST */
tokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
<super.tokenRef(...)>
<if(!ruleDescriptor.isSynPred)>
<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
<label>_tree = <createNodeFromToken(...)>;
root_0 = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_0);
<if(backtracking)>}<endif>
<endif>
>>

/** ids+=ID! and output=AST */
Expand Down Expand Up @@ -98,7 +102,7 @@ tokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
// I have more time.

matchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <%
<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);}, ...)>
<super.matchSet(postmatchCode={<if(!ruleDescriptor.isSynPred)><if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <createNodeFromToken(...)>);<endif>}, ...)>
%>

matchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
Expand All @@ -114,15 +118,17 @@ matchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
<if(label)>
<label>=(<labelType>)input.LT(1);<\n>
<endif>
<super.matchSet(postmatchCode={<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = (<ASTLabelType>)adaptor.becomeRoot(<createNodeFromToken(...)>, root_0);},...)>
<super.matchSet(postmatchCode={<if(!ruleDescriptor.isSynPred)><if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>root_0 = (<ASTLabelType>)adaptor.becomeRoot(<createNodeFromToken(...)>, root_0);<endif>},...)>
>>

// RULE REF AST

/** rule when output=AST */
ruleRef(rule,label,elementIndex,args,scope) ::= <<
<super.ruleRef(...)>
<if(!ruleDescriptor.isSynPred)>
<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) <endif>adaptor.addChild(root_0, <label>.getTree());
<endif>
>>

/** rule! is same as normal rule ref */
Expand Down Expand Up @@ -156,20 +162,24 @@ ruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<

wildcard(token,label,elementIndex,terminalOptions) ::= <<
<super.wildcard(...)>
<if(!ruleDescriptor.isSynPred)>
<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
<label>_tree = (<ASTLabelType>)adaptor.create(<label>);
adaptor.addChild(root_0, <label>_tree);
<if(backtracking)>}<endif>
<endif>
>>

wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"

wildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
<super.wildcard(...)>
<if(!ruleDescriptor.isSynPred)>
<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>
<label>_tree = (<ASTLabelType>)adaptor.create(<label>);
root_0 = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_0);
<if(backtracking)>}<endif>
<endif>
>>

createNodeFromToken(label,terminalOptions) ::= <<
Expand Down

0 comments on commit db6adae

Please sign in to comment.