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 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) else: args.append(t) raise Exception("couldn't parse expression!") 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, 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")