Revisão | f0b4560b44f9ea5af16823d2341aac4c10c33f5b (tree) |
---|---|
Hora | 2017-04-18 22:55:24 |
Autor | dhrname <dhrname@user...> |
Commiter | dhrname |
Modify the ST_parse
@@ -360,6 +360,14 @@ bool ST_parse(ST_Token_Mode *array, size_t length, ST_Ordered_Pair *list) | ||
360 | 360 | /*リストの現在のヘッダー*/ |
361 | 361 | ST_Ordered_Pair *head = list; |
362 | 362 | |
363 | + /*スタックリスト*/ | |
364 | + ST_Ordered_Pair *stacklist; | |
365 | + ST_Ordered_Pair *stacklistafter; | |
366 | + stacklist = &ST_EMPTY; | |
367 | + stacklistafter = &ST_EMPTY; | |
368 | + /*stacklistの解放用変数*/ | |
369 | + ST_Ordered_Pair *stackfree = NULL; | |
370 | + | |
363 | 371 | #pragma omp parallel for |
364 | 372 | for (int_fast32_t i = length-1; i >= 0; i--) |
365 | 373 | { |
@@ -368,26 +376,53 @@ bool ST_parse(ST_Token_Mode *array, size_t length, ST_Ordered_Pair *list) | ||
368 | 376 | { |
369 | 377 | if (isoutofPARENTHESES(i, array, length)) |
370 | 378 | { |
371 | - /*変数がカッコの外であれば、*/ | |
372 | 379 | if (varcode == ST_first(head)) |
373 | 380 | { |
374 | - /*ここでリストの値を書き換えている*/ | |
381 | + /*リストの値を書き換えている*/ | |
375 | 382 | head->first = aftervarcode; |
376 | 383 | } |
377 | 384 | } |
378 | 385 | else |
379 | 386 | { |
380 | 387 | /*変数がカッコ内であれば、*/ |
388 | + | |
389 | + /*前もって、varcodeやaftervarcodeの値をスタックに積んでキャッシュしておく*/ | |
390 | + stacklist = ST_pair(varcode, stacklist); | |
391 | + stacklistafter = ST_pair(aftervarcode, stacklistafter); | |
392 | + | |
381 | 393 | varcode = ST_first(head); |
382 | 394 | aftervarcode = i; |
383 | 395 | head->first = aftervarcode; |
384 | 396 | } |
385 | 397 | head = ST_second(head); |
386 | 398 | } |
399 | + else if (mode == ST_KAGIKAKKO_BEGIN_TOKEN) | |
400 | + { | |
401 | + stackfree = stacklist; | |
402 | + /*スタックからデータを取り出す*/ | |
403 | + varcode = ST_first(stacklist); | |
404 | + stacklist = ST_second(stacklist); | |
405 | + free(stackfree); | |
406 | + stackfree = NULL; | |
407 | + | |
408 | + stackfree = stacklistafter; | |
409 | + aftervarcode = ST_first(stacklistafter); | |
410 | + stacklistafter = ST_second(stacklistafter); | |
411 | + free(stackfree); | |
412 | + stackfree = NULL; | |
413 | + } | |
387 | 414 | } |
388 | 415 | return true; |
389 | 416 | } |
390 | 417 | |
418 | +/*以下の連結リスト構造については数学とラムダ計算と項書き換え系を参照のこと | |
419 | + * ここでは、:=を定義とする | |
420 | + * 空集合 := {} | |
421 | + * 順序対 あるいは、Ordered Pair := (a, b) | |
422 | + * (a, b) := { a, {a, b} } | |
423 | + * n項組 あるいは、n組、n-tupples := [a, b, c, ... ] | |
424 | + * [a, b, c] := (a, ( b, (c, {}) ) )*/ | |
425 | + | |
391 | 426 | /*ST_EMPTY |
392 | 427 | * 空リストを表現する構造体 |
393 | 428 | * クロージャのある他の言語では、関数で実装する*/ |
@@ -504,7 +539,7 @@ ST_Ordered_Pair *ST_setChurchNumber (uint_fast32_t length, Ord2ST_Ordered_Pair f | ||
504 | 539 | } |
505 | 540 | |
506 | 541 | /*ST_getItem 関数 |
507 | - * 入力されたリストの頭からnum番目にある項目の値を取り出す*/ | |
542 | + * 入力されたリストの最後からnum番目にある項目の値を取り出す(num >= 0)*/ | |
508 | 543 | ST_Ordered_Pair *ST_getItem (ST_Ordered_Pair *list, uint_fast32_t num) { |
509 | 544 | return ST_setChurchNumber(num, ST_second, list); |
510 | 545 | } |
@@ -275,6 +275,14 @@ int main(int argc, char **argv) | ||
275 | 275 | assert(ST_first(ST_second(varlist)) == ST_first(varlist)); |
276 | 276 | ST_freelist(varlist); |
277 | 277 | |
278 | + ST_Token_Mode tokens3[12] = {0}; | |
279 | + length = sizeof(tokens3) / sizeof(tokens3[0]); | |
280 | + varlist = ST_tokenize(u8"「愛「愛」(愛)」(愛)", tokens3); | |
281 | + assert(ST_parse(tokens3, length, varlist) == true); | |
282 | + assert(ST_first(ST_second(varlist)) != ST_first(varlist)); | |
283 | + assert(ST_first(ST_getItem(varlist, 1)) != ST_first(varlist)); | |
284 | + assert(ST_first(ST_getItem(varlist, 0)) == ST_first(varlist)); | |
285 | + ST_freelist(varlist); | |
278 | 286 | |
279 | 287 | |
280 | 288 | ST_Token_Mode tokenmode = ST_FUNCTION_APPLY_TOKEN; |
@@ -341,6 +349,10 @@ int main(int argc, char **argv) | ||
341 | 349 | |
342 | 350 | assert(ST_getNumber(ppp, dummy) == 1); |
343 | 351 | assert(ST_getNumber(ST_second(ppp), dummy) == 0); |
352 | + assert(ST_first(ST_getItem(ppp, 0)) == 3); | |
353 | + assert(ST_first(ST_getItem(ppp, 1)) == 2); | |
354 | + assert(ST_first(ST_getItem(ppp, 2)) == 1); | |
355 | + assert(ST_getItem(ppp, 3) == &ST_EMPTY); | |
344 | 356 | ST_freelist(ppp); |
345 | 357 | |
346 | 358 | eprint_log("Error!\n"); |