def ele(self, name): # name of terminals are lower-cased, non-terminals are upper-cased last_alt = self.alts[-1] if name.islower(): last_alt.append(terminal(name)) else: if name not in rule.name_rule_mapping: raise Exception("Undefined non-terminal: " + name) last_alt.append(rule.name_rule_mapping[name]) return self
def ele( self, name ): # name of terminals are lower-cased, non-terminals are upper-cased last_alt = self.alts[-1] if name.islower(): last_alt.append(terminal(name)) else: if name not in rule.name_rule_mapping: raise Exception("Undefined non-terminal: " + name) last_alt.append(rule.name_rule_mapping[name]) return self
def __kleene(self, constructor, *elements): eles = [] for e in elements: if e.islower(): eles.append(terminal(e)) else: if e not in self.name_rule_mapping: raise Exception("Undefined non-terminal: " + e) eles.append(rule.name_rule_mapping[e]) ks = constructor(eles) last_alt = self.alts[-1] last_alt.append(ks) return self