//## Node Node.ParseNewNode(Token[] tokenList, int beginIdx, int endIdx, boolean isMetaPattern); static KMETHOD Node_ParseNewNode(KonohaContext *kctx, KonohaStack *sfp) { kNode *stmt = sfp[0].asNode; kArray *tokenList = sfp[1].asArray; int beginIdx = (int)sfp[2].intValue; int endIdx = (int)sfp[3].intValue; ParseOption opt = (sfp[4].boolValue == true) ? ParseMetaPatternOption : 0; KReturn(SUGAR ParseNewNode(kctx, kNode_ns(stmt), tokenList, &beginIdx, endIdx, opt, NULL)); }
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); }
static kNode* kNode_ParseClassNodeNULL(KonohaContext *kctx, kNode *stmt, kToken *tokenClassName) { kNode *block = NULL; kTokenVar *blockToken = (kTokenVar *)kNode_GetObject(kctx, stmt, KSymbol_BlockPattern, NULL); if(blockToken != NULL) { kNameSpace *ns = kNode_ns(stmt); SUGAR kToken_ToBraceGroup(kctx, blockToken, ns, NULL); KTokenSeq source = {ns, RangeGroup(blockToken->GroupTokenList)}; block = SUGAR ParseNewNode(kctx, ns, source.tokenList, &source.beginIdx, source.endIdx, ParseMetaPatternOption, NULL); KLIB kObjectProto_SetObject(kctx, stmt, KSymbol_BlockPattern, KType_Node, block); } return block; }
static KMETHOD Expression_isNotNull(KonohaContext *kctx, KonohaStack *sfp) { VAR_Expression(stmt, tokenList, beginIdx, opIdx, endIdx); if(opIdx + 2 == endIdx) { DBG_P("checking .. x != null"); kTokenVar *tk = tokenList->TokenVarItems[opIdx+1]; if(tk->symbol == KSymbol_("null") || tk->symbol == KSymbol_("NULL")) { kNameSpace *ns = kNode_ns(stmt); tk->symbol = KSymbol_("IsNotNull"); tk->resolvedSyntaxInfo = tokenList->TokenVarItems[opIdx]->resolvedSyntaxInfo; SUGAR kNode_Op(kctx, stmt, tk, 1, SUGAR ParseNewNode(kctx, ns, tokenList, &beginIdx, opIdx, ParseExpressionOption, NULL)); KReturnUnboxValue(opIdx + 2); } } DBG_P("checking parent .. != .."); KReturnUnboxValue(-1); }
static kNode *ParseSource(KonohaContext *kctx, kNameSpace *ns, const char *script, size_t len) { KBuffer wb; KLIB KBuffer_Init(&(kctx->stack->cwb), &wb); KLIB KBuffer_Write(kctx, &wb, "(", 1); KLIB KBuffer_Write(kctx, &wb, script, len); KLIB KBuffer_Write(kctx, &wb, ")", 1); KTokenSeq tokens = {ns, KGetParserContext(kctx)->preparedTokenList}; KTokenSeq_Push(kctx, tokens); const char *buf = KLIB KBuffer_text(kctx, &wb, EnsureZero); SUGAR Tokenize(kctx, ns, buf, 0, 0, tokens.tokenList); KTokenSeq_End(kctx, tokens); KTokenSeq step2 = {ns, tokens.tokenList, kArray_size(tokens.tokenList)}; SUGAR Preprocess(kctx, ns, RangeTokenSeq(tokens), NULL, step2.tokenList); KTokenSeq_End(kctx, step2); kNode *newexpr = SUGAR ParseNewNode(kctx, ns, step2.tokenList, &step2.beginIdx, step2.endIdx, 0, NULL); KTokenSeq_Pop(kctx, tokens); KLIB KBuffer_Free(&wb); return newexpr; }
static KMETHOD Expression_LispOperator(KonohaContext *kctx, KonohaStack *sfp) { VAR_Expression(expr, tokenList, beginIdx, currentIdx, endIdx); kNameSpace *ns = kNode_ns(expr); if(beginIdx == currentIdx && beginIdx + 1 < endIdx) { kTokenVar *opToken = tokenList->TokenVarItems[beginIdx]; kNode_Type(kctx, expr, KNode_Block, KType_var); int i = beginIdx + 1; SUGAR kNode_Op(kctx, expr, opToken, 0); while(i < endIdx) { int orig = i; kNode *node = SUGAR ParseNewNode(kctx, ns, tokenList, &i, i+1, ParseExpressionOption, "("); SUGAR kNode_AddNode(kctx, expr, node); assert(i != orig); } int size = kNode_GetNodeListSize(kctx, expr); if(size == 1) { /* case (+) */ assert(0 && "(+) is not supported"); } else if(size == 2) { /* case (+ 1) */ KReturnUnboxValue(endIdx); } /* (+ 1 2 3 4) => (+ (+ (+ 1 2) 3 ) 4) */ kNode *leftNode = kNode_At(expr, 1), *rightNode; for(i = 2; i < size-1; i++) { kNode *node = KNewNode(ns); rightNode = kNode_At(expr, i); SUGAR kNode_Op(kctx, node, opToken, 2, leftNode, rightNode); leftNode = node; } rightNode = kNode_At(expr, i); KLIB kArray_Clear(kctx, expr->NodeList, 1); KLIB kArray_Add(kctx, expr->NodeList, leftNode); KLIB kArray_Add(kctx, expr->NodeList, rightNode); KDump(expr); KReturnUnboxValue(endIdx); } }