| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| from antlr4.IntervalSet import IntervalSet |
| from antlr4.Token import Token |
|
|
| |
| from antlr4.atn.SemanticContext import Predicate, PrecedencePredicate |
|
|
| ATNState = None |
| RuleStartState = None |
|
|
| class Transition (object): |
| |
| EPSILON = 1 |
| RANGE = 2 |
| RULE = 3 |
| PREDICATE = 4 |
| ATOM = 5 |
| ACTION = 6 |
| SET = 7 |
| NOT_SET = 8 |
| WILDCARD = 9 |
| PRECEDENCE = 10 |
|
|
| serializationNames = [ |
| "INVALID", |
| "EPSILON", |
| "RANGE", |
| "RULE", |
| "PREDICATE", |
| "ATOM", |
| "ACTION", |
| "SET", |
| "NOT_SET", |
| "WILDCARD", |
| "PRECEDENCE" |
| ] |
|
|
| serializationTypes = dict() |
|
|
| def __init__(self, target:ATNState): |
| |
| if target is None: |
| raise Exception("target cannot be null.") |
| self.target = target |
| |
| self.isEpsilon = False |
| self.label = None |
|
|
|
|
| |
| class AtomTransition(Transition): |
|
|
| def __init__(self, target:ATNState, label:int): |
| super().__init__(target) |
| self.label_ = label |
| self.label = self.makeLabel() |
| self.serializationType = self.ATOM |
|
|
| def makeLabel(self): |
| s = IntervalSet() |
| s.addOne(self.label_) |
| return s |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return self.label_ == symbol |
|
|
| def __str__(self): |
| return str(self.label_) |
|
|
| class RuleTransition(Transition): |
|
|
| def __init__(self, ruleStart:RuleStartState, ruleIndex:int, precedence:int, followState:ATNState): |
| super().__init__(ruleStart) |
| self.ruleIndex = ruleIndex |
| self.precedence = precedence |
| self.followState = followState |
| self.serializationType = self.RULE |
| self.isEpsilon = True |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return False |
|
|
|
|
| class EpsilonTransition(Transition): |
|
|
| def __init__(self, target, outermostPrecedenceReturn=-1): |
| super(EpsilonTransition, self).__init__(target) |
| self.serializationType = self.EPSILON |
| self.isEpsilon = True |
| self.outermostPrecedenceReturn = outermostPrecedenceReturn |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return False |
|
|
| def __str__(self): |
| return "epsilon" |
|
|
| class RangeTransition(Transition): |
|
|
| def __init__(self, target:ATNState, start:int, stop:int): |
| super().__init__(target) |
| self.serializationType = self.RANGE |
| self.start = start |
| self.stop = stop |
| self.label = self.makeLabel() |
|
|
| def makeLabel(self): |
| s = IntervalSet() |
| s.addRange(range(self.start, self.stop + 1)) |
| return s |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return symbol >= self.start and symbol <= self.stop |
|
|
| def __str__(self): |
| return "'" + chr(self.start) + "'..'" + chr(self.stop) + "'" |
|
|
| class AbstractPredicateTransition(Transition): |
|
|
| def __init__(self, target:ATNState): |
| super().__init__(target) |
|
|
|
|
| class PredicateTransition(AbstractPredicateTransition): |
|
|
| def __init__(self, target:ATNState, ruleIndex:int, predIndex:int, isCtxDependent:bool): |
| super().__init__(target) |
| self.serializationType = self.PREDICATE |
| self.ruleIndex = ruleIndex |
| self.predIndex = predIndex |
| self.isCtxDependent = isCtxDependent |
| self.isEpsilon = True |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return False |
|
|
| def getPredicate(self): |
| return Predicate(self.ruleIndex, self.predIndex, self.isCtxDependent) |
|
|
| def __str__(self): |
| return "pred_" + str(self.ruleIndex) + ":" + str(self.predIndex) |
|
|
| class ActionTransition(Transition): |
|
|
| def __init__(self, target:ATNState, ruleIndex:int, actionIndex:int=-1, isCtxDependent:bool=False): |
| super().__init__(target) |
| self.serializationType = self.ACTION |
| self.ruleIndex = ruleIndex |
| self.actionIndex = actionIndex |
| self.isCtxDependent = isCtxDependent |
| self.isEpsilon = True |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return False |
|
|
| def __str__(self): |
| return "action_"+self.ruleIndex+":"+self.actionIndex |
|
|
| |
| class SetTransition(Transition): |
|
|
| def __init__(self, target:ATNState, set:IntervalSet): |
| super().__init__(target) |
| self.serializationType = self.SET |
| if set is not None: |
| self.label = set |
| else: |
| self.label = IntervalSet() |
| self.label.addRange(range(Token.INVALID_TYPE, Token.INVALID_TYPE + 1)) |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return symbol in self.label |
|
|
| def __str__(self): |
| return str(self.label) |
|
|
| class NotSetTransition(SetTransition): |
|
|
| def __init__(self, target:ATNState, set:IntervalSet): |
| super().__init__(target, set) |
| self.serializationType = self.NOT_SET |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return symbol >= minVocabSymbol \ |
| and symbol <= maxVocabSymbol \ |
| and not super(type(self), self).matches(symbol, minVocabSymbol, maxVocabSymbol) |
|
|
| def __str__(self): |
| return '~' + super(type(self), self).__str__() |
|
|
|
|
| class WildcardTransition(Transition): |
|
|
| def __init__(self, target:ATNState): |
| super().__init__(target) |
| self.serializationType = self.WILDCARD |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return symbol >= minVocabSymbol and symbol <= maxVocabSymbol |
|
|
| def __str__(self): |
| return "." |
|
|
|
|
| class PrecedencePredicateTransition(AbstractPredicateTransition): |
|
|
| def __init__(self, target:ATNState, precedence:int): |
| super().__init__(target) |
| self.serializationType = self.PRECEDENCE |
| self.precedence = precedence |
| self.isEpsilon = True |
|
|
| def matches( self, symbol:int, minVocabSymbol:int, maxVocabSymbol:int): |
| return False |
|
|
|
|
| def getPredicate(self): |
| return PrecedencePredicate(self.precedence) |
|
|
| def __str__(self): |
| return self.precedence + " >= _p" |
|
|
|
|
| Transition.serializationTypes = { |
| EpsilonTransition: Transition.EPSILON, |
| RangeTransition: Transition.RANGE, |
| RuleTransition: Transition.RULE, |
| PredicateTransition: Transition.PREDICATE, |
| AtomTransition: Transition.ATOM, |
| ActionTransition: Transition.ACTION, |
| SetTransition: Transition.SET, |
| NotSetTransition: Transition.NOT_SET, |
| WildcardTransition: Transition.WILDCARD, |
| PrecedencePredicateTransition: Transition.PRECEDENCE |
| } |
|
|
| del ATNState |
| del RuleStartState |
|
|
| from antlr4.atn.ATNState import * |