from tokens import * def peek(inp): if len(inp) == 0: return None return inp[0] def parse_expression(tkns): # expressions MUST start with a symbol (for now?) symbol = None args = [] for idx, t in enumerate(tkns): #if isinstance(t, NebOpen): 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:] else: # TODO nested expressions 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")