LexerATNSimulator

This commit is contained in:
Peter Boyer 2015-12-19 18:28:22 -05:00
parent 56589c8029
commit 2df791a266
5 changed files with 105 additions and 112 deletions

View File

@ -78,73 +78,6 @@ func (a *ATNConfig) InitATNConfig(c *ATNConfig, state *ATNState, context *Predic
} }
//
//
//func checkParams(params *ATNConfig, isCfg bool) *ATNConfigParams {
// if(params == nil) {
// var result = { state:nil, alt:nil, context:nil, semanticContext:nil }
// if(isCfg) {
// result.reachesIntoOuterContext = 0
// }
// return result
// } else {
// var props = {}
// props.state = params.state || nil
// props.alt = params.alt || nil
// props.context = params.context || nil
// props.semanticContext = params.semanticContext || nil
// if(isCfg) {
// props.reachesIntoOuterContext = params.reachesIntoOuterContext || 0
// props.precedenceFilterSuppressed = params.precedenceFilterSuppressed || false
// }
// return props
// }
//}
//
//
//func NewATNConfig(params *ATNConfig, config *ATNConfig) *ATNConfig {
//
// this := new(ATNConfig)
//
// this.checkContext(params, config)
//
// params = checkParams(params, false)
// config = checkParams(config, true)
//
// if params.state != nil {
// this.state = params.state
// } else {
// this.state = config.state
// }
//
// if params.alt != nil {
// this.alt = params.alt
// } else {
// this.alt = config.alt
// }
//
// this.context = params.context!=nil ? params.context : config.context
//
// this.semanticContext = params.semanticContext!=nil ? params.semanticContext :
// (config.semanticContext!=nil ? config.semanticContext : SemanticContext.NONE)
//
// this.reachesIntoOuterContext = config.reachesIntoOuterContext
// this.precedenceFilterSuppressed = config.precedenceFilterSuppressed
//
// return this
//}
//
//
//
//
//
//func (this *ATNConfig) checkContext(params, config) {
// if((params.context==nil || params.context==nil) &&
// (config==nil || config.context==nil || config.context==nil)) {
// this.context = nil
// }
//}
// An ATN configuration is equal to another if both have // An ATN configuration is equal to another if both have
// the same state, they predict the same alternative, and // the same state, they predict the same alternative, and
// syntactic/semantic contexts are the same. // syntactic/semantic contexts are the same.
@ -203,11 +136,74 @@ type LexerATNConfig struct {
passedThroughNonGreedyDecision bool passedThroughNonGreedyDecision bool
} }
func NewLexerATNConfig( state *ATNState, alt int, context *PredictionContext) *LexerATNConfig {
func checkNonGreedyDecision(source *LexerATNConfig, target *ATNState) bool {
ds, ok := target.(*DecisionState)
return source.passedThroughNonGreedyDecision || (ok && ds.nonGreedy)
}
func NewLexerATNConfig6(state *ATNState, alt int, context *PredictionContext) *LexerATNConfig {
this := new(LexerATNConfig) this := new(LexerATNConfig)
this.InitATNConfig(state, alt, context, SemanticContextNONE) this.InitATNConfig(state, alt, context, SemanticContextNONE)
this.passedThroughNonGreedyDecision = false
this.lexerActionExecutor = nil
return this
}
func NewLexerATNConfig5(state *ATNState, alt int, context *PredictionContext, lexerActionExecutor *LexerActionExecutor) *LexerATNConfig {
this := new(LexerATNConfig)
this.InitATNConfig(state, alt, context, SemanticContextNONE)
this.lexerActionExecutor = lexerActionExecutor
this.passedThroughNonGreedyDecision = false
return this
}
func NewLexerATNConfig4(c *LexerATNConfig, state *ATNState) *LexerATNConfig {
this := new(LexerATNConfig)
this.InitATNConfig(c, state, c.context, c.semanticContext)
this.lexerActionExecutor = c.lexerActionExecutor
this.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
return this
}
func NewLexerATNConfig3(c *LexerATNConfig, state *ATNState, lexerActionExecutor *LexerActionExecutor) *LexerATNConfig {
this := new(LexerATNConfig)
this.InitATNConfig(c, state, c.context, c.semanticContext)
this.lexerActionExecutor = lexerActionExecutor
this.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
return this
}
func NewLexerATNConfig2(c *LexerATNConfig, state *ATNState, context *PredictionContext) *LexerATNConfig {
this := new(LexerATNConfig)
this.InitATNConfig(c, state, context, c.semanticContext)
this.lexerActionExecutor = c.lexerActionExecutor
this.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
return this
}
func NewLexerATNConfig1( state *ATNState, alt int, context *PredictionContext) *LexerATNConfig {
this := new(LexerATNConfig)
// c *ATNConfig, state *ATNState, context *PredictionContext, semanticContext *SemanticContext
this.InitATNConfig(state, alt, context, SemanticContextNONE)
this.lexerActionExecutor = nil this.lexerActionExecutor = nil
this.passedThroughNonGreedyDecision = false this.passedThroughNonGreedyDecision = false
@ -215,6 +211,7 @@ func NewLexerATNConfig( state *ATNState, alt int, context *PredictionContext) *L
return this return this
} }
func (this *LexerATNConfig) hashString() { func (this *LexerATNConfig) hashString() {
var f string var f string
@ -255,9 +252,4 @@ func (this *LexerATNConfig) equals(other *ATNConfig) bool {
} }
} }
//func (this *LexerATNConfig) checkNonGreedyDecision(source, target) {
// return source.passedThroughNonGreedyDecision ||
// _, ok := target.(DecisionState); ok && target.nonGreedy
//}

View File

@ -261,7 +261,7 @@ func (this *LexerATNSimulator) computeTargetState(input *InputStream, s *DFAStat
if (!reach.hasSemanticContext) { if (!reach.hasSemanticContext) {
// we got nowhere on t, don't panic out this knowledge it'd // we got nowhere on t, don't panic out this knowledge it'd
// cause a failover from DFA later. // cause a failover from DFA later.
this.addDFAEdge(s, t, ATNSimulatorERROR) this.addDFAEdge(s, t, ATNSimulatorERROR, nil)
} }
// stop when we can't match any more char // stop when we can't match any more char
return ATNSimulatorERROR return ATNSimulatorERROR
@ -281,7 +281,7 @@ func (this *LexerATNSimulator) failOrAccept(prevAccept *SimState, input *InputSt
if (t == TokenEOF && input.index == this.startIndex) { if (t == TokenEOF && input.index == this.startIndex) {
return TokenEOF return TokenEOF
} }
panic NewLexerNoViableAltException(this.recog, input, this.startIndex, reach) panic(NewLexerNoViableAltException(this.recog, input, this.startIndex, reach))
} }
} }
@ -295,23 +295,22 @@ func (this *LexerATNSimulator) getReachableConfigSet(input *InputStream, closure
for i := 0; i < len(closure.configs); i++ { for i := 0; i < len(closure.configs); i++ {
var cfg = closure.configs[i] var cfg = closure.configs[i]
var currentAltReachedAcceptState = (cfg.alt == skipAlt) var currentAltReachedAcceptState = (cfg.alt == skipAlt)
if (currentAltReachedAcceptState && cfg.passedThroughNonGreedyDecision) { if (currentAltReachedAcceptState && cfg.(*LexerATNConfig).passedThroughNonGreedyDecision) {
continue continue
} }
if (LexerATNSimulatordebug) { if (LexerATNSimulatordebug) {
fmt.Println("testing %s at %s\n", this.getTokenName(t), cfg fmt.Println("testing %s at %s\n", this.getTokenName(t), cfg.toString(this.recog, true))
.toString(this.recog, true))
} }
for j := 0; j < len(cfg.state.transitions); j++ { for j := 0; j < len(cfg.state.transitions); j++ {
var trans = cfg.state.transitions[j] // for each transition var trans = cfg.state.transitions[j] // for each transition
var target = this.getReachableTarget(trans, t) var target = this.getReachableTarget(trans, t)
if (target != nil) { if (target != nil) {
var lexerActionExecutor = cfg.lexerActionExecutor var lexerActionExecutor = cfg.(*LexerATNConfig).lexerActionExecutor
if (lexerActionExecutor != nil) { if (lexerActionExecutor != nil) {
lexerActionExecutor = lexerActionExecutor.fixOffsetBeforeMatch(input.index - this.startIndex) lexerActionExecutor = lexerActionExecutor.fixOffsetBeforeMatch(input.index - this.startIndex)
} }
var treatEofAsEpsilon = (t == TokenEOF) var treatEofAsEpsilon = (t == TokenEOF)
var config = NewLexerATNConfig({state:target, lexerActionExecutor:lexerActionExecutor}, cfg) var config = NewLexerATNConfig3(cfg, target, lexerActionExecutor)
if (this.closure(input, config, reach, if (this.closure(input, config, reach,
currentAltReachedAcceptState, true, treatEofAsEpsilon)) { currentAltReachedAcceptState, true, treatEofAsEpsilon)) {
// any remaining configs for this alt have a lower priority // any remaining configs for this alt have a lower priority
@ -344,12 +343,12 @@ func (this *LexerATNSimulator) getReachableTarget(trans *Transition, t int) *ATN
} }
} }
func (this *LexerATNSimulator) computeStartState(input *InputStream, p *ATNState ) { func (this *LexerATNSimulator) computeStartState(input *InputStream, p *ATNState ) *OrderedATNConfigSet {
var initialContext = PredictionContextEMPTY
var configs = NewOrderedATNConfigSet() var configs = NewOrderedATNConfigSet()
for i := 0; i < len(p.transitions); i++ { for i := 0; i < len(p.transitions); i++ {
var target = p.transitions[i].target var target = p.transitions[i].target
var cfg = NewLexerATNConfig({state:target, alt:i+1, context:initialContext}, nil) var cfg = NewLexerATNConfig6(target, i+1, PredictionContextEMPTY)
this.closure(input, cfg, configs, false, false, false) this.closure(input, cfg, configs, false, false, false)
} }
return configs return configs
@ -369,7 +368,9 @@ func (this *LexerATNSimulator) closure(input *InputStream, config *LexerATNConfi
if (LexerATNSimulatordebug) { if (LexerATNSimulatordebug) {
fmt.Println("closure(" + config.toString(this.recog, true) + ")") fmt.Println("closure(" + config.toString(this.recog, true) + ")")
} }
if (config.state instanceof RuleStopState) {
_, ok :=config.state.(*RuleStopState)
if (ok) {
if (LexerATNSimulatordebug) { if (LexerATNSimulatordebug) {
if (this.recog != nil) { if (this.recog != nil) {
fmt.Println("closure at %s rule stop %s\n", this.recog.getRuleNames()[config.state.ruleIndex], config) fmt.Println("closure at %s rule stop %s\n", this.recog.getRuleNames()[config.state.ruleIndex], config)
@ -379,10 +380,10 @@ func (this *LexerATNSimulator) closure(input *InputStream, config *LexerATNConfi
} }
if (config.context == nil || config.context.hasEmptyPath()) { if (config.context == nil || config.context.hasEmptyPath()) {
if (config.context == nil || config.context.isEmpty()) { if (config.context == nil || config.context.isEmpty()) {
configs.add(config) configs.add(config, nil)
return true return true
} else { } else {
configs.add(NewLexerATNConfig({ state:config.state, context:PredictionContextEMPTY}, config)) configs.add(NewLexerATNConfig2(config, config.state, PredictionContextEMPTY), nil)
currentAltReachedAcceptState = true currentAltReachedAcceptState = true
} }
} }
@ -391,10 +392,8 @@ func (this *LexerATNSimulator) closure(input *InputStream, config *LexerATNConfi
if (config.context.getReturnState(i) != PredictionContextEMPTY_RETURN_STATE) { if (config.context.getReturnState(i) != PredictionContextEMPTY_RETURN_STATE) {
var newContext = config.context.getParent(i) // "pop" return state var newContext = config.context.getParent(i) // "pop" return state
var returnState = this.atn.states[config.context.getReturnState(i)] var returnState = this.atn.states[config.context.getReturnState(i)]
cfg = NewLexerATNConfig({ state:returnState, context:newContext }, config) cfg := NewLexerATNConfig2(config, returnState, newContext)
currentAltReachedAcceptState = this.closure(input, cfg, currentAltReachedAcceptState = this.closure(input, cfg, configs, currentAltReachedAcceptState, speculative, treatEofAsEpsilon)
configs, currentAltReachedAcceptState, speculative,
treatEofAsEpsilon)
} }
} }
} }
@ -403,12 +402,12 @@ func (this *LexerATNSimulator) closure(input *InputStream, config *LexerATNConfi
// optimization // optimization
if (!config.state.epsilonOnlyTransitions) { if (!config.state.epsilonOnlyTransitions) {
if (!currentAltReachedAcceptState || !config.passedThroughNonGreedyDecision) { if (!currentAltReachedAcceptState || !config.passedThroughNonGreedyDecision) {
configs.add(config) configs.add(config, nil)
} }
} }
for j := 0; j < len(config.state.transitions); j++ { for j := 0; j < len(config.state.transitions); j++ {
var trans = config.state.transitions[j] var trans = config.state.transitions[j]
cfg = this.getEpsilonTarget(input, config, trans, configs, speculative, treatEofAsEpsilon) cfg := this.getEpsilonTarget(input, config, trans, configs, speculative, treatEofAsEpsilon)
if (cfg != nil) { if (cfg != nil) {
currentAltReachedAcceptState = this.closure(input, cfg, configs, currentAltReachedAcceptState = this.closure(input, cfg, configs,
currentAltReachedAcceptState, speculative, treatEofAsEpsilon) currentAltReachedAcceptState, speculative, treatEofAsEpsilon)
@ -424,10 +423,13 @@ func (this *LexerATNSimulator) getEpsilonTarget(input *InputStream, config *Lexe
var cfg *LexerATNConfig var cfg *LexerATNConfig
if (trans.serializationType == TransitionRULE) { if (trans.serializationType == TransitionRULE) {
var newContext = SingletonPredictionContext.create(config.context, trans.followState.stateNumber)
cfg = NewLexerATNConfig( { state:trans.target, context:newContext}, config) rt := trans.(*RuleTransition)
var newContext = SingletonPredictionContextcreate(config.context, rt.followState.stateNumber)
cfg = NewLexerATNConfig2(config, trans.target, newContext )
} else if (trans.serializationType == TransitionPRECEDENCE) { } else if (trans.serializationType == TransitionPRECEDENCE) {
panic "Precedence predicates are not supported in lexers." panic("Precedence predicates are not supported in lexers.")
} else if (trans.serializationType == TransitionPREDICATE) { } else if (trans.serializationType == TransitionPREDICATE) {
// Track traversing semantic predicates. If we traverse, // Track traversing semantic predicates. If we traverse,
// we cannot add a DFA state for this "reach" computation // we cannot add a DFA state for this "reach" computation
@ -447,12 +449,14 @@ func (this *LexerATNSimulator) getEpsilonTarget(input *InputStream, config *Lexe
// states reached by traversing predicates. Since this is when we // states reached by traversing predicates. Since this is when we
// test them, we cannot cash the DFA state target of ID. // test them, we cannot cash the DFA state target of ID.
pt := trans.(*PredicateTransition)
if (LexerATNSimulatordebug) { if (LexerATNSimulatordebug) {
fmt.Println("EVAL rule " + trans.ruleIndex + ":" + trans.predIndex) fmt.Println("EVAL rule " + trans.(*PredicateTransition).ruleIndex + ":" + pt.predIndex)
} }
configs.hasSemanticContext = true configs.hasSemanticContext = true
if (this.evaluatePredicate(input, trans.ruleIndex, trans.predIndex, speculative)) { if (this.evaluatePredicate(input, pt.ruleIndex, pt.predIndex, speculative)) {
cfg = NewLexerATNConfig({ state:trans.target}, config) cfg = NewLexerATNConfig4(config, trans.target)
} }
} else if (trans.serializationType == TransitionACTION) { } else if (trans.serializationType == TransitionACTION) {
if (config.context == nil || config.context.hasEmptyPath()) { if (config.context == nil || config.context.hasEmptyPath()) {
@ -469,19 +473,19 @@ func (this *LexerATNSimulator) getEpsilonTarget(input *InputStream, config *Lexe
// additional modifications are needed before we can support // additional modifications are needed before we can support
// the split operation. // the split operation.
var lexerActionExecutor = LexerActionExecutorappend(config.lexerActionExecutor, this.atn.lexerActions[trans.actionIndex]) var lexerActionExecutor = LexerActionExecutorappend(config.lexerActionExecutor, this.atn.lexerActions[trans.actionIndex])
cfg = NewLexerATNConfig({ state:trans.target, lexerActionExecutor:lexerActionExecutor }, config) cfg = NewLexerATNConfig3(config, trans.target, lexerActionExecutor)
} else { } else {
// ignore actions in referenced rules // ignore actions in referenced rules
cfg = NewLexerATNConfig( { state:trans.target}, config) cfg = NewLexerATNConfig4(config, trans.target)
} }
} else if (trans.serializationType == TransitionEPSILON) { } else if (trans.serializationType == TransitionEPSILON) {
cfg = NewLexerATNConfig({ state:trans.target}, config) cfg = NewLexerATNConfig4(config, trans.target)
} else if (trans.serializationType == TransitionATOM || } else if (trans.serializationType == TransitionATOM ||
trans.serializationType == TransitionRANGE || trans.serializationType == TransitionRANGE ||
trans.serializationType == TransitionSET) { trans.serializationType == TransitionSET) {
if (treatEofAsEpsilon) { if (treatEofAsEpsilon) {
if (trans.matches(TokenEOF, 0, 0xFFFF)) { if (trans.matches(TokenEOF, 0, 0xFFFF)) {
cfg = NewLexerATNConfig( { state:trans.target }, config) cfg = NewLexerATNConfig4(config, trans.target)
} }
} }
} }

View File

@ -107,7 +107,7 @@ type PrecedencePredicate struct {
precedence int precedence int
} }
func PrecedencePredicate(precedence int) *PrecedencePredicate { func NewPrecedencePredicate(precedence int) *PrecedencePredicate {
this := new(PrecedencePredicate) this := new(PrecedencePredicate)
this.precedence = precedence this.precedence = precedence
@ -115,9 +115,6 @@ func PrecedencePredicate(precedence int) *PrecedencePredicate {
return this return this
} }
//PrecedencePredicate.prototype = Object.create(SemanticContext.prototype)
//PrecedencePredicate.prototype.constructor = PrecedencePredicate
func (this *PrecedencePredicate) evaluate(parser *Recognizer, outerContext *RuleContext) *SemanticContext { func (this *PrecedencePredicate) evaluate(parser *Recognizer, outerContext *RuleContext) *SemanticContext {
return parser.precpred(outerContext, this.precedence) return parser.precpred(outerContext, this.precedence)
} }
@ -272,7 +269,7 @@ func (this *AND) evalPrecedence(parser *Recognizer, outerContext *RuleContext) *
if (result == nil){ if (result == nil){
result = 0 result = 0
} else { } else {
result = SemanticPredicateandContext(result, o) result = SemanticContextandContext(result, o)
} }
} }

View File

@ -235,7 +235,7 @@ type PredicateTransition struct {
ruleIndex, predIndex int ruleIndex, predIndex int
} }
func PredicateTransition ( target *ATNState, ruleIndex, predIndex int, isCtxDependent bool ) *PredicateTransition { func NewPredicateTransition ( target *ATNState, ruleIndex, predIndex int, isCtxDependent bool ) *PredicateTransition {
t := new(PredicateTransition) t := new(PredicateTransition)
t.InitTransition(target) t.InitTransition(target)
@ -332,7 +332,7 @@ type NotSetTransition struct {
SetTransition SetTransition
} }
func NotSetTransition ( target *ATNState, set *IntervalSet) *NotSetTransition { func NewNotSetTransition ( target *ATNState, set *IntervalSet) *NotSetTransition {
t := new(NotSetTransition) t := new(NotSetTransition)
t.InitTransition( target ) t.InitTransition( target )
@ -379,7 +379,7 @@ type PrecedencePredicateTransition struct {
precedence int precedence int
} }
func PrecedencePredicateTransition ( target *ATNState, precedence int ) *PrecedencePredicateTransition { func NewPrecedencePredicateTransition ( target *ATNState, precedence int ) *PrecedencePredicateTransition {
t := new(PrecedencePredicateTransition) t := new(PrecedencePredicateTransition)
t.InitTransition( target ) t.InitTransition( target )
@ -396,7 +396,7 @@ func (t *PrecedencePredicateTransition) matches(symbol, minVocabSymbol, maxVoca
return false return false
} }
func (t *PrecedencePredicateTransition) getPredicate() *NewPrecedencePredicate { func (t *PrecedencePredicateTransition) getPredicate() *PrecedencePredicate {
return NewPrecedencePredicate(t.precedence) return NewPrecedencePredicate(t.precedence)
} }

View File

@ -301,7 +301,7 @@ AND.prototype.evalPrecedence = function(parser, outerContext) {
} }
var result = null; var result = null;
operands.map(function(o) { operands.map(function(o) {
result = result === null ? o : SemanticPredicate.andContext(result, o); result = result === null ? o : SemanticContext.andContext(result, o);
}); });
return result; return result;
}; };