|
|
|
|
|
|
|
|
|
|
|
|
|
|
from antlr4.IntervalSet import IntervalSet |
|
|
|
|
|
from antlr4.RuleContext import RuleContext |
|
|
|
|
|
from antlr4.Token import Token |
|
|
from antlr4.atn.ATNType import ATNType |
|
|
from antlr4.atn.ATNState import ATNState, DecisionState |
|
|
|
|
|
|
|
|
class ATN(object): |
|
|
__slots__ = ( |
|
|
'grammarType', 'maxTokenType', 'states', 'decisionToState', |
|
|
'ruleToStartState', 'ruleToStopState', 'modeNameToStartState', |
|
|
'ruleToTokenType', 'lexerActions', 'modeToStartState' |
|
|
) |
|
|
|
|
|
INVALID_ALT_NUMBER = 0 |
|
|
|
|
|
|
|
|
def __init__(self, grammarType:ATNType , maxTokenType:int ): |
|
|
|
|
|
self.grammarType = grammarType |
|
|
|
|
|
self.maxTokenType = maxTokenType |
|
|
self.states = [] |
|
|
|
|
|
|
|
|
|
|
|
self.decisionToState = [] |
|
|
|
|
|
self.ruleToStartState = [] |
|
|
|
|
|
self.ruleToStopState = None |
|
|
self.modeNameToStartState = dict() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.ruleToTokenType = None |
|
|
|
|
|
|
|
|
self.lexerActions = None |
|
|
self.modeToStartState = [] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def nextTokensInContext(self, s:ATNState, ctx:RuleContext): |
|
|
from antlr4.LL1Analyzer import LL1Analyzer |
|
|
anal = LL1Analyzer(self) |
|
|
return anal.LOOK(s, ctx=ctx) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def nextTokensNoContext(self, s:ATNState): |
|
|
if s.nextTokenWithinRule is not None: |
|
|
return s.nextTokenWithinRule |
|
|
s.nextTokenWithinRule = self.nextTokensInContext(s, None) |
|
|
s.nextTokenWithinRule.readonly = True |
|
|
return s.nextTokenWithinRule |
|
|
|
|
|
def nextTokens(self, s:ATNState, ctx:RuleContext = None): |
|
|
if ctx==None: |
|
|
return self.nextTokensNoContext(s) |
|
|
else: |
|
|
return self.nextTokensInContext(s, ctx) |
|
|
|
|
|
def addState(self, state:ATNState): |
|
|
if state is not None: |
|
|
state.atn = self |
|
|
state.stateNumber = len(self.states) |
|
|
self.states.append(state) |
|
|
|
|
|
def removeState(self, state:ATNState): |
|
|
self.states[state.stateNumber] = None |
|
|
|
|
|
def defineDecisionState(self, s:DecisionState): |
|
|
self.decisionToState.append(s) |
|
|
s.decision = len(self.decisionToState)-1 |
|
|
return s.decision |
|
|
|
|
|
def getDecisionState(self, decision:int): |
|
|
if len(self.decisionToState)==0: |
|
|
return None |
|
|
else: |
|
|
return self.decisionToState[decision] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getExpectedTokens(self, stateNumber:int, ctx:RuleContext ): |
|
|
if stateNumber < 0 or stateNumber >= len(self.states): |
|
|
raise Exception("Invalid state number.") |
|
|
s = self.states[stateNumber] |
|
|
following = self.nextTokens(s) |
|
|
if Token.EPSILON not in following: |
|
|
return following |
|
|
expected = IntervalSet() |
|
|
expected.addSet(following) |
|
|
expected.removeOne(Token.EPSILON) |
|
|
while (ctx != None and ctx.invokingState >= 0 and Token.EPSILON in following): |
|
|
invokingState = self.states[ctx.invokingState] |
|
|
rt = invokingState.transitions[0] |
|
|
following = self.nextTokens(rt.followState) |
|
|
expected.addSet(following) |
|
|
expected.removeOne(Token.EPSILON) |
|
|
ctx = ctx.parentCtx |
|
|
if Token.EPSILON in following: |
|
|
expected.addOne(Token.EOF) |
|
|
return expected |
|
|
|