| | |
| | |
| | |
| | |
| | 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): |
| | __slots__ = ('atnStartState', 'decision', '_states', 's0', 'precedenceDfa') |
| |
|
| | 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) |
| |
|