//## void Node.AddParsedObject(keyword nameid, Object obj); static KMETHOD Node_AddParsedObject(KonohaContext *kctx, KonohaStack *sfp) { kNode *stmt = sfp[0].asNode; ksymbol_t symbol = (ksymbol_t)sfp[1].intValue; SUGAR kNode_AddParsedObject(kctx, stmt, symbol, sfp[2].asObject); KReturnVoid(); }
static KMETHOD PatternMatch_ForStmt(KonohaContext *kctx, KonohaStack *sfp) { VAR_PatternMatch(stmt, name, tokenList, beginIdx, endIdx); /* for(IniitExpr; CondExpr; IterateExpr) $Block */ kNameSpace *ns = kNode_ns(stmt); int i, start = beginIdx; /* InitExpression Part */ for(i = beginIdx; i < endIdx; i++) { kTokenVar *tk = tokenList->TokenVarItems[i]; if(tk->symbol == KSymbol_SEMICOLON) { if(start < i) { kNode *node = SUGAR ParseNewNode(kctx, ns, tokenList, &start, i, ParseMetaPatternOption, NULL); SUGAR kNode_AddParsedObject(kctx, stmt, KSymbol_("init"), UPCAST(node)); } start = i + 1; break; } } if(start == beginIdx) { KReturnUnboxValue(-1); } /* CondExpression Part */ for(i = start; i < endIdx; i++) { kTokenVar *tk = tokenList->TokenVarItems[i]; if(tk->symbol == KSymbol_SEMICOLON) { if(start < i) { kNode *node = SUGAR ParseNewNode(kctx, ns, tokenList, &start, i, ParseExpressionOption, NULL); KDump(node); SUGAR kNode_AddParsedObject(kctx, stmt, KSymbol_ExprPattern, UPCAST(node)); } start = i + 1; break; } } if(i == endIdx) { KReturnUnboxValue(-1); } /* IterExpression Part */ if(start < endIdx) { kNode *node = SUGAR ParseNewNode(kctx, ns, tokenList, &start, endIdx, ParseMetaPatternOption, NULL); SUGAR kNode_AddParsedObject(kctx, stmt, KSymbol_("Iterator"), UPCAST(node)); } KReturnUnboxValue(endIdx); }