forked from jasder/antlr
fail option on predicates work.
This commit is contained in:
parent
d96e02019a
commit
ed7d4b1dc1
|
@ -40,6 +40,7 @@ import org.antlr.v4.runtime.misc.Nullable;
|
||||||
public class FailedPredicateException extends RecognitionException {
|
public class FailedPredicateException extends RecognitionException {
|
||||||
public int ruleIndex;
|
public int ruleIndex;
|
||||||
public int predIndex;
|
public int predIndex;
|
||||||
|
public String predicate;
|
||||||
public String msg;
|
public String msg;
|
||||||
|
|
||||||
public FailedPredicateException(Parser recognizer) {
|
public FailedPredicateException(Parser recognizer) {
|
||||||
|
@ -52,8 +53,25 @@ public class FailedPredicateException extends RecognitionException {
|
||||||
PredicateTransition trans = (PredicateTransition)s.transition(0);
|
PredicateTransition trans = (PredicateTransition)s.transition(0);
|
||||||
ruleIndex = trans.ruleIndex;
|
ruleIndex = trans.ruleIndex;
|
||||||
predIndex = trans.predIndex;
|
predIndex = trans.predIndex;
|
||||||
|
this.predicate = predicate;
|
||||||
this.msg = String.format("failed predicate: {%s}?", predicate);
|
this.msg = String.format("failed predicate: {%s}?", predicate);
|
||||||
Token la = recognizer.getCurrentToken();
|
Token la = recognizer.getCurrentToken();
|
||||||
this.offendingToken = la;
|
this.offendingToken = la;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FailedPredicateException(Parser recognizer,
|
||||||
|
@Nullable String predicate,
|
||||||
|
@Nullable String msg)
|
||||||
|
{
|
||||||
|
super(recognizer, recognizer.getInputStream(), recognizer._ctx);
|
||||||
|
ATNState s = recognizer.getInterpreter().atn.states.get(recognizer._ctx.s);
|
||||||
|
PredicateTransition trans = (PredicateTransition)s.transition(0);
|
||||||
|
ruleIndex = trans.ruleIndex;
|
||||||
|
predIndex = trans.predIndex;
|
||||||
|
this.predicate = predicate;
|
||||||
|
this.msg = msg;
|
||||||
|
Token la = recognizer.getCurrentToken();
|
||||||
|
this.offendingToken = la;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -489,7 +489,7 @@ ArgAction(a, chunks) ::= "<chunks>"
|
||||||
|
|
||||||
SemPred(p, chunks, failChunks) ::= <<
|
SemPred(p, chunks, failChunks) ::= <<
|
||||||
setState(<p.stateNumber>);
|
setState(<p.stateNumber>);
|
||||||
if (!(<chunks>)) throw new FailedPredicateException(this, <if(p.msg)><p.msg><else><failChunks><endif>);
|
if (!(<chunks>)) throw new FailedPredicateException(this, <p.predicate><if(failChunks)>, <failChunks><elseif(p.msg)>, <p.msg><endif>);
|
||||||
>>
|
>>
|
||||||
|
|
||||||
ExceptionClause(e, catchArg, catchAction) ::= <<
|
ExceptionClause(e, catchArg, catchAction) ::= <<
|
||||||
|
|
|
@ -35,28 +35,28 @@ import org.antlr.v4.codegen.OutputModelFactory;
|
||||||
import org.antlr.v4.codegen.model.chunk.ActionChunk;
|
import org.antlr.v4.codegen.model.chunk.ActionChunk;
|
||||||
import org.antlr.v4.tool.ast.ActionAST;
|
import org.antlr.v4.tool.ast.ActionAST;
|
||||||
import org.antlr.v4.tool.ast.GrammarAST;
|
import org.antlr.v4.tool.ast.GrammarAST;
|
||||||
import org.antlr.v4.tool.ast.PredAST;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public class SemPred extends Action {
|
public class SemPred extends Action {
|
||||||
public String msg; // user-specified in grammar option
|
public String msg; // user-specified string in fail grammar option
|
||||||
|
public String predicate; // the predicate string with { }? stripped
|
||||||
|
|
||||||
|
/** user-specified action in fail grammar option */
|
||||||
@ModelElement public List<ActionChunk> failChunks;
|
@ModelElement public List<ActionChunk> failChunks;
|
||||||
|
|
||||||
public SemPred(OutputModelFactory factory, ActionAST ast) {
|
public SemPred(OutputModelFactory factory, ActionAST ast) {
|
||||||
super(factory,ast);
|
super(factory,ast);
|
||||||
GrammarAST failNode = ((PredAST)ast).getOptionAST("fail");
|
GrammarAST failNode = ast.getOptionAST("fail");
|
||||||
CodeGenerator gen = factory.getGenerator();
|
CodeGenerator gen = factory.getGenerator();
|
||||||
if ( failNode==null ) {
|
predicate = ast.getText();
|
||||||
msg = ast.getText();
|
if (predicate.startsWith("{") && predicate.endsWith("}?")) {
|
||||||
if (msg.startsWith("{") && msg.endsWith("}?")) {
|
predicate = predicate.substring(1, predicate.length() - 2);
|
||||||
msg = msg.substring(1, msg.length() - 2);
|
|
||||||
}
|
|
||||||
msg = gen.target.getTargetStringLiteralFromString(msg);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
predicate = gen.target.getTargetStringLiteralFromString(predicate);
|
||||||
|
|
||||||
|
if ( failNode==null ) return;
|
||||||
|
|
||||||
if ( failNode instanceof ActionAST ) {
|
if ( failNode instanceof ActionAST ) {
|
||||||
ActionAST failActionNode = (ActionAST)failNode;
|
ActionAST failActionNode = (ActionAST)failNode;
|
||||||
|
|
Loading…
Reference in New Issue