static KMETHOD PatternMatch_ClassName(KonohaContext *kctx, KonohaStack *sfp) { VAR_PatternMatch(stmt, name, tokenList, beginIdx, endIdx); kTokenVar *tk = tokenList->TokenVarItems[beginIdx]; int returnIdx = -1; if(tk->resolvedSyntaxInfo->keyword == KW_SymbolPattern || tk->resolvedSyntaxInfo->keyword == KW_TypePattern) { KLIB kObject_setObject(kctx, stmt, name, O_typeId(tk), tk); returnIdx = beginIdx + 1; } KReturnUnboxValue(returnIdx); }
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); }