from tokens import * def peek(inp): if len(inp) == 0: return None return inp[0] def parse_expression(tkns): symbol = None args = [] add_idx = 0 for idx, t in enumerate(tkns): # if we evaluated a nested expression, skip ahead # TODO or list? if add_idx > 0: add_idx -= 1 continue if idx == 0: if not isinstance(t, NebSymbol): raise Exception("expressions must start with a symbol") else: symbol = t elif isinstance(t, NebClose): return NebExpression(symbol, args), tkns[idx + 1:], idx + 1 # nested expressions elif isinstance(t, NebOpen): expr, remainder, add_idx = parse_expression(tkns[idx + 1:]) args.append(expr) elif isinstance(t, NebListStart): # TODO this might need to be add_idx + (return of parse_list) lst, remainder, add_idx = parse_list(tkns[idx + 1:]) args.append(lst) else: args.append(t) raise Exception("couldn't parse expression!") def parse_list(tkns): items = [] add_idx = 0 for idx, t in enumerate(tkns): if add_idx > 0: add_idx -= 1 continue if isinstance(t, NebListEnd): return NebList(items), tkns[idx + 1:], idx + 1 elif isinstance(t, NebOpen): expr, remainder, add_idx = parse_expression(tkns[1 + idx:]) items.append(expr) elif isinstance(t, NebLiteral): items.append(t) elif isinstance(t, NebSymbol): items.append(t) elif isinstance(t, NebListStart): # TODO: this probably means lists of lists don't work lst, remainder, add_idx = parse_list(tkns[1:]) items.append(lst) raise Exception("couldn't parse list!") def parse(tkns, parsed): nxt = peek(tkns) if nxt is None: return parsed if isinstance(nxt, NebOpen): expr, remainder, _ = parse_expression(tkns[1:]) parsed.append(expr) return parse(remainder, parsed) elif isinstance(nxt, NebListStart): lst, remainder, _ = parse_list(tkns[1:]) parsed.append(lst) return parse(remainder, parsed) elif isinstance(nxt, NebLiteral): parsed.append(nxt) return parse(tkns[1:], parsed) elif isinstance(nxt, NebSymbol): parsed.append(nxt) return parse(tkns[1:], parsed) else: raise Exception("expecting an expression or a literal")