Fix generated alt numbers for non-greedy quantifiers
This commit is contained in:
parent
4d2df41cdb
commit
b879d508ee
|
@ -402,7 +402,7 @@ setState(<choice.stateNumber>);
|
|||
//_errHandler.sync(this);
|
||||
switch ( getInterpreter().adaptivePredict(_input,<choice.decision>,_ctx) ) {
|
||||
<alts:{alt |
|
||||
case <i>:
|
||||
case <i><if(!choice.ast.greedy)>+1<endif>:
|
||||
<alt>
|
||||
break;}; separator="\n">
|
||||
}
|
||||
|
@ -413,7 +413,7 @@ setState(<choice.stateNumber>);
|
|||
_errHandler.sync(this);
|
||||
_alt = getInterpreter().adaptivePredict(_input,<choice.decision>,_ctx);
|
||||
while ( _alt!=<choice.exitAlt> && _alt!=-1 ) {
|
||||
if ( _alt==1 ) {
|
||||
if ( _alt==1<if(!choice.ast.greedy)>+1<endif> ) {
|
||||
<iteration>
|
||||
<alts> <! should only be one !>
|
||||
}
|
||||
|
@ -430,7 +430,7 @@ _alt = getInterpreter().adaptivePredict(_input,<choice.decision>,_ctx);
|
|||
do {
|
||||
switch ( _alt ) {
|
||||
<alts:{alt|
|
||||
case <i>:
|
||||
case <i><if(!choice.ast.greedy)>+1<endif>:
|
||||
<alt>
|
||||
break;}; separator="\n">
|
||||
default :
|
||||
|
|
|
@ -31,6 +31,7 @@ package org.antlr.v4.codegen.model;
|
|||
|
||||
import org.antlr.v4.codegen.OutputModelFactory;
|
||||
import org.antlr.v4.tool.ast.GrammarAST;
|
||||
import org.antlr.v4.tool.ast.QuantifierAST;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -38,7 +39,7 @@ import java.util.List;
|
|||
public class Loop extends Choice {
|
||||
public int blockStartStateNumber;
|
||||
public int loopBackStateNumber;
|
||||
public int exitAlt;
|
||||
public final int exitAlt;
|
||||
|
||||
@ModelElement public List<SrcOp> iteration;
|
||||
|
||||
|
@ -47,6 +48,8 @@ public class Loop extends Choice {
|
|||
List<CodeBlockForAlt> alts)
|
||||
{
|
||||
super(factory, blkOrEbnfRootAST, alts);
|
||||
boolean nongreedy = (blkOrEbnfRootAST instanceof QuantifierAST) && !((QuantifierAST)blkOrEbnfRootAST).isGreedy();
|
||||
exitAlt = nongreedy ? 1 : alts.size() + 1;
|
||||
}
|
||||
|
||||
public void addIterationOp(SrcOp op) {
|
||||
|
|
|
@ -30,7 +30,8 @@
|
|||
package org.antlr.v4.codegen.model;
|
||||
|
||||
import org.antlr.v4.codegen.OutputModelFactory;
|
||||
import org.antlr.v4.runtime.atn.*;
|
||||
import org.antlr.v4.runtime.atn.PlusBlockStartState;
|
||||
import org.antlr.v4.runtime.atn.PlusLoopbackState;
|
||||
import org.antlr.v4.tool.ast.GrammarAST;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -51,6 +52,5 @@ public class PlusBlock extends Loop {
|
|||
loopBackStateNumber = loop.stateNumber;
|
||||
this.error = getThrowNoViableAlt(factory, plusRoot, null);
|
||||
decision = loop.decision;
|
||||
exitAlt = alts.size()+1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,5 @@ public class StarBlock extends Loop {
|
|||
StarLoopEntryState star = (StarLoopEntryState)blkOrEbnfRootAST.atnState;
|
||||
loopBackStateNumber = star.loopBackState.stateNumber;
|
||||
decision = star.decision;
|
||||
exitAlt = alts.size()+1;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue