def grammar_grammar(): """Builds the grammar for the grammar file """ # star: '*' | '+' star = Alternative( "star", Token('*'), Token('+') ) star_opt = KleeneStar ( "star_opt", 0, 1, rule=star ) # rule: SYMBOL ':' alternative symbol = Sequence( "symbol", Token('SYMBOL'), star_opt ) symboldef = Token( "SYMDEF" ) alternative = Sequence( "alternative" ) rule = Sequence( "rule", symboldef, alternative ) # grammar: rule+ grammar = KleeneStar( "grammar", _min=1, rule=rule ) # alternative: sequence ( '|' sequence )* sequence = KleeneStar( "sequence", 1 ) seq_cont_list = Sequence( "seq_cont_list", Token('|'), sequence ) sequence_cont = KleeneStar( "sequence_cont",0, rule=seq_cont_list ) alternative.args = [ sequence, sequence_cont ] # option: '[' alternative ']' option = Sequence( "option", Token('['), alternative, Token(']') ) # group: '(' alternative ')' group = Sequence( "group", Token('('), alternative, Token(')'), star_opt ) # sequence: (SYMBOL | STRING | option | group )+ string = Token('STRING') alt = Alternative( "sequence_alt", symbol, string, option, group ) sequence.args = [ alt ] return grammar
def repeat(self, star_opt, myrule): if star_opt.nodes: rule_name = self.new_name() tok = star_opt.nodes[0].nodes[0] if tok.value == '+': return self.new_item(KleeneStar(rule_name, _min=1, rule=myrule)) elif tok.value == '*': return self.new_item(KleeneStar(rule_name, _min=0, rule=myrule)) else: raise SyntaxError("Got symbol star_opt with value='%s'" % tok.value) return myrule
def build_symbol(self, values): """symbol: SYMBOL star?""" sym = values[0] star = values[1] if star is True: return sym _min = 0 _max = -1 if star == '*': _min = 0 elif star == '+': _min = 1 sym = KleeneStar(self.get_name(), _min, _max, rule=sym) sym.star = star debug_rule(sym) self.items.append(sym) return sym
def build_symbol( self, values ): """symbol: SYMBOL star?""" sym = values[0] star = values[1] if star is True: return sym _min = 0 _max = -1 if star=='*': _min = 0 elif star=='+': _min = 1 sym = KleeneStar( self.get_name(), _min, _max, rule=sym ) sym.star = star debug_rule( sym ) self.items.append(sym) return sym
def grammar_grammar(): """Builds the grammar for the grammar file """ # star: '*' | '+' star = Alternative("star", Token('*'), Token('+')) star_opt = KleeneStar("star_opt", 0, 1, rule=star) # rule: SYMBOL ':' alternative symbol = Sequence("symbol", Token('SYMBOL'), star_opt) symboldef = Token("SYMDEF") alternative = Sequence("alternative") rule = Sequence("rule", symboldef, alternative) # grammar: rule+ grammar = KleeneStar("grammar", _min=1, rule=rule) # alternative: sequence ( '|' sequence )* sequence = KleeneStar("sequence", 1) seq_cont_list = Sequence("seq_cont_list", Token('|'), sequence) sequence_cont = KleeneStar("sequence_cont", 0, rule=seq_cont_list) alternative.args = [sequence, sequence_cont] # option: '[' alternative ']' option = Sequence("option", Token('['), alternative, Token(']')) # group: '(' alternative ')' group = Sequence("group", Token('('), alternative, Token(')'), star_opt) # sequence: (SYMBOL | STRING | option | group )+ string = Token('STRING') alt = Alternative("sequence_alt", symbol, string, option, group) sequence.args = [alt] return grammar
def visit_option(self, node): rule = node.nodes[1].visit(self) return self.new_item(KleeneStar(self.new_name(), 0, 1, rule))
def build_option(self, values): """option: '[' alternative ']'""" sym = KleeneStar(self.get_name(), 0, 1, rule=values[1]) debug_rule(sym) self.items.append(sym) return sym