// Copied from namespace.h. static void kNameSpace_AppendArrayRef(KonohaContext *kctx, kNameSpace *ns, const kArray **arrayRef, kObject *o) { if(arrayRef[0] == NULL) { ((kArray**)arrayRef)[0] = new_(Array, 0, ns->NameSpaceConstList); } DBG_ASSERT(IS_Array(arrayRef[0])); KLIB kArray_Add(kctx, arrayRef[0], o); }
//## Array[Node] Node.GetNodeList(); static KMETHOD Node_GetNodeList(KonohaContext *kctx, KonohaStack *sfp) { if(sfp[0].asNode->NodeList != NULL && IS_Array(sfp[0].asNode->NodeList)) { KReturn(sfp[0].asNode->NodeList); } else { KReturn(K_NULL); } }
static KMETHOD Statement_syntax(KonohaContext *kctx, KonohaStack *sfp) { kbool_t r = 0; VAR_Statement(stmt, gma); kTokenArray *tokenList = (kTokenArray *)kStmt_GetObject(kctx, stmt, KW_TokenPattern, NULL); if(tokenList == NULL) { SUGAR kStmt_Message2(kctx, stmt, NULL, ErrTag, "empty syntax"); } if(tokenList != NULL) { if(!IS_Array(tokenList)) { // create tokenList from a Token kTokenArray *a = new_(TokenArray, 0, OnGcStack); KLIB kArray_Add(kctx, a, tokenList); tokenList = a; } DBG_ASSERT(IS_Array(tokenList)); kNameSpace *ns = Stmt_ns(stmt); SugarSyntaxVar *syn = kNameSpace_guessSyntaxFromTokenList(kctx, ns, tokenList); if(syn != NULL) { if(syn->syntaxPatternListNULL_OnList != NULL) { SUGAR kStmt_Message2(kctx, stmt, NULL, InfoTag, "oveloading syntax: %s%s", PSYM_t(syn->keyword)); } else { syn->syntaxPatternListNULL_OnList = new_(TokenArray, 0, ns->NameSpaceConstList); } TokenSeq tokens = {ns, tokenList, 0, kArray_size(tokenList)}; // Referred to kNameSpace_ParseSyntaxPattern in ast.h. kArray *patternList = syn->syntaxPatternListNULL_OnList; size_t firstPatternIdx = kArray_size(patternList); SUGAR kArray_AddSyntaxRule(kctx, patternList, &tokens); if(firstPatternIdx < kArray_size(patternList)) { kToken *firstPattern = patternList->TokenItems[firstPatternIdx]; if(kToken_isFirstPattern(firstPattern)) { kNameSpace_AppendArrayRef(kctx, ns, &((kNameSpaceVar *)ns)->stmtPatternListNULL_OnList, UPCAST(firstPattern)); } } r = 1; } kStmt_done(kctx, stmt); } KReturnUnboxValue(r); }
//## Expr Expr.addExpr(Expr expr, Expr o); static KMETHOD kExpr_AddExpr(KonohaContext *kctx, KonohaStack *sfp) { kExpr *expr = sfp[0].asExpr; kExpr *o = sfp[1].asExpr; if(IS_NULL(o) && IS_Array(expr->cons)) { kObject_set(NullObject, expr, 1); } if(IS_NOTNULL(expr)) { KLIB kArray_Add(kctx, expr->cons, o); } KReturn(expr); }
static KMETHOD Expression_Defined(KonohaContext *kctx, KonohaStack *sfp) { VAR_Expression(stmt, tokenList, beginIdx, currentIdx, endIdx); if(beginIdx == currentIdx && beginIdx + 1 < endIdx) { kTokenVar *definedToken = tokenList->TokenVarItems[beginIdx]; // defined kTokenVar *pToken = tokenList->TokenVarItems[beginIdx+1]; if(IS_Array(pToken->subTokenList)) { kExpr *expr = SUGAR new_UntypedCallStyleExpr(kctx, definedToken->resolvedSyntaxInfo, 1, definedToken); filterArrayList(kctx, Stmt_ns(stmt), pToken->subTokenList, 0, kArray_size(pToken->subTokenList)); KReturn(SUGAR kStmt_AddExprParam(kctx, stmt, expr, pToken->subTokenList, 0, kArray_size(pToken->subTokenList), 0/*isAllowEmpty*/)); } } }
static KMETHOD Expression_Defined(KonohaContext *kctx, KonohaStack *sfp) { VAR_Expression(expr, tokenList, beginIdx, currentIdx, endIdx); kNameSpace *ns = kNode_ns(expr); if(beginIdx == currentIdx && beginIdx + 1 < endIdx) { kTokenVar *definedToken = tokenList->TokenVarItems[beginIdx]; // defined kTokenVar *pToken = tokenList->TokenVarItems[beginIdx+1]; if(IS_Array(pToken->GroupTokenList)) { SUGAR kNode_Op(kctx, expr, definedToken, 0); FilterDefinedParam(kctx, ns, RangeGroup(pToken->GroupTokenList)); KReturn(SUGAR AppendParsedNode(kctx, expr, RangeGroup(pToken->GroupTokenList), NULL, ParseExpressionOption, "(")); } } }
//## Token[] Stmt.getTokenList(symbol keyword, Token[] def); static KMETHOD Stmt_getTokenList(KonohaContext *kctx, KonohaStack *sfp) { kStmt *stmt = sfp[0].asStmt; ksymbol_t keyword = (ksymbol_t)sfp[1].intValue; kArray *def = sfp[2].asArray; kTokenArray *tokenList = (kTokenArray *)kStmt_GetObject(kctx, stmt, keyword, def); kTokenArray *ret; if(!IS_Array(tokenList)) { ret = new_(TokenArray, 0, OnStack); KLIB kArray_Add(kctx, ret, tokenList); } else { ret = tokenList; } KReturn(ret); }