|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from antlr4.IntervalSet import IntervalSet |
|
from antlr4.Token import Token |
|
|
|
|
|
from antlr4.atn.SemanticContext import Predicate, PrecedencePredicate |
|
|
|
ATNState = None |
|
RuleStartState = None |
|
|
|
class Transition (object): |
|
__slots__ = ('target','isEpsilon','label') |
|
|
|
|
|
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): |
|
__slots__ = ('label_', 'serializationType') |
|
|
|
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): |
|
__slots__ = ('ruleIndex', 'precedence', 'followState', 'serializationType') |
|
|
|
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): |
|
__slots__ = ('serializationType', 'outermostPrecedenceReturn') |
|
|
|
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): |
|
__slots__ = ('serializationType', 'start', 'stop') |
|
|
|
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): |
|
__slots__ = ('serializationType', 'ruleIndex', 'predIndex', 'isCtxDependent') |
|
|
|
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): |
|
__slots__ = ('serializationType', 'ruleIndex', 'actionIndex', 'isCtxDependent') |
|
|
|
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): |
|
__slots__ = 'serializationType' |
|
|
|
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): |
|
__slots__ = 'serializationType' |
|
|
|
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): |
|
__slots__ = ('serializationType', 'precedence') |
|
|
|
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 * |
|
|