| |
| |
| |
| |
| from antlr4.atn.ATNState import StarLoopEntryState |
|
|
| from antlr4.atn.ATNConfigSet import ATNConfigSet |
| from antlr4.atn.ATNState import DecisionState |
| from antlr4.dfa.DFAState import DFAState |
| from antlr4.error.Errors import IllegalStateException |
|
|
|
|
| class DFA(object): |
|
|
| def __init__(self, atnStartState:DecisionState, decision:int=0): |
| |
| self.atnStartState = atnStartState |
| self.decision = decision |
| |
| |
| self._states = dict() |
| self.s0 = None |
| |
| |
| |
| self.precedenceDfa = False |
|
|
| if isinstance(atnStartState, StarLoopEntryState): |
| if atnStartState.isPrecedenceDecision: |
| self.precedenceDfa = True |
| precedenceState = DFAState(configs=ATNConfigSet()) |
| precedenceState.edges = [] |
| precedenceState.isAcceptState = False |
| precedenceState.requiresFullContext = False |
| self.s0 = precedenceState |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| def getPrecedenceStartState(self, precedence:int): |
| if not self.precedenceDfa: |
| raise IllegalStateException("Only precedence DFAs may contain a precedence start state.") |
|
|
| |
| if precedence < 0 or precedence >= len(self.s0.edges): |
| return None |
| return self.s0.edges[precedence] |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| def setPrecedenceStartState(self, precedence:int, startState:DFAState): |
| if not self.precedenceDfa: |
| raise IllegalStateException("Only precedence DFAs may contain a precedence start state.") |
|
|
| if precedence < 0: |
| return |
|
|
| |
| |
| |
| if precedence >= len(self.s0.edges): |
| ext = [None] * (precedence + 1 - len(self.s0.edges)) |
| self.s0.edges.extend(ext) |
| self.s0.edges[precedence] = startState |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| def setPrecedenceDfa(self, precedenceDfa:bool): |
| if self.precedenceDfa != precedenceDfa: |
| self._states = dict() |
| if precedenceDfa: |
| precedenceState = DFAState(configs=ATNConfigSet()) |
| precedenceState.edges = [] |
| precedenceState.isAcceptState = False |
| precedenceState.requiresFullContext = False |
| self.s0 = precedenceState |
| else: |
| self.s0 = None |
| self.precedenceDfa = precedenceDfa |
|
|
| @property |
| def states(self): |
| return self._states |
|
|
| |
| def sortedStates(self): |
| return sorted(self._states.keys(), key=lambda state: state.stateNumber) |
|
|
| def __str__(self): |
| return self.toString(None) |
|
|
| def toString(self, literalNames:list=None, symbolicNames:list=None): |
| if self.s0 is None: |
| return "" |
| from antlr4.dfa.DFASerializer import DFASerializer |
| serializer = DFASerializer(self,literalNames,symbolicNames) |
| return str(serializer) |
|
|
| def toLexerString(self): |
| if self.s0 is None: |
| return "" |
| from antlr4.dfa.DFASerializer import LexerDFASerializer |
| serializer = LexerDFASerializer(self) |
| return str(serializer) |
|
|
|
|