void parseBlockExp (Lexer& lex, ExpList& list) { switch (lex.current().tok) { case tSemicolon: lex.advance(); break; case tLet: list.push_back(parseLet(lex)); lex.eat(tSemicolon); break; case tLCurl: list.push_back(parseBlock(lex)); break; case tIf: list.push_back(parseCond(lex)); break; case tLoop: list.push_back(parseLoop(lex)); break; case tFor: list.push_back(parseFor(lex)); break; // everthing else does default: list.push_back(parseAssign(lex, parseExp(lex))); if (lex.current() != tSemicolon) lex.expect(tRCurl); else lex.eat(tSemicolon); break; } }
ExpPtr parseTermPrefix (Lexer& lex) { Token tok = lex.current(); switch (tok.tok) { case tNumberInt: tok = lex.advance(); return Exp::make(eInt, tok.valueInt, {}, tok.span); case tNumberReal: tok = lex.advance(); return Exp::make(eReal, tok.valueReal, {}, tok.span); case tString: tok = lex.advance(); return Exp::make(eString, tok.str, {}, tok.span); case tTrue: case tFalse: tok = lex.advance(); return Exp::make(eBool, tok == tTrue, {}, tok.span); case tIdent: tok = lex.advance(); return Exp::make(eVar, tok.str, bool(true), {}, tok.span); case tLParen: return parseTuple(lex); case tIf: return parseCond(lex); case tLCurl: return parseBlock(lex); case tLBrack: return parseList(lex); case tFunc: case tLambda: return parseLambda(lex); case tiMake: return parseiMake(lex); case tiGet: return parseiGet(lex); case tiPut: return parseiPut(lex); case tiCall: return parseiCall(lex); default: //lex.expect("term"); lex.unexpect(); return nullptr; } }
static int parse(ej_t *ep, int state, int flags) { a_assert(ep); switch (state) { /* * Any statement, function arguments or conditional expressions */ case STATE_STMT: if ((state = parseStmt(ep, state, flags)) != STATE_STMT_DONE && state != STATE_EOF && state != STATE_STMT_BLOCK_DONE && state != STATE_RET) { state = STATE_ERR; } break; case STATE_DEC: if ((state = parseStmt(ep, state, flags)) != STATE_DEC_DONE && state != STATE_EOF) { state = STATE_ERR; } break; case STATE_EXPR: if ((state = parseStmt(ep, state, flags)) != STATE_EXPR_DONE && state != STATE_EOF) { state = STATE_ERR; } break; /* * Variable declaration list */ case STATE_DEC_LIST: state = parseDeclaration(ep, state, flags); break; /* * Function argument string */ case STATE_ARG_LIST: state = parseArgs(ep, state, flags); break; /* * Logical condition list (relational operations separated by &&, ||) */ case STATE_COND: state = parseCond(ep, state, flags); break; /* * Expression list */ case STATE_RELEXP: state = parseExpr(ep, state, flags); break; } if (state == STATE_ERR && ep->error == NULL) { ejError(ep, T("Syntax error")); } return state; }