• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisãof0b4560b44f9ea5af16823d2341aac4c10c33f5b (tree)
Hora2017-04-18 22:55:24
Autordhrname <dhrname@user...>
Commiterdhrname

Mensagem de Log

Modify the ST_parse

Mudança Sumário

Diff

--- a/source_code/shadowstar.c
+++ b/source_code/shadowstar.c
@@ -360,6 +360,14 @@ bool ST_parse(ST_Token_Mode *array, size_t length, ST_Ordered_Pair *list)
360360 /*リストの現在のヘッダー*/
361361 ST_Ordered_Pair *head = list;
362362
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+
363371 #pragma omp parallel for
364372 for (int_fast32_t i = length-1; i >= 0; i--)
365373 {
@@ -368,26 +376,53 @@ bool ST_parse(ST_Token_Mode *array, size_t length, ST_Ordered_Pair *list)
368376 {
369377 if (isoutofPARENTHESES(i, array, length))
370378 {
371- /*変数がカッコの外であれば、*/
372379 if (varcode == ST_first(head))
373380 {
374- /*ここでリストの値を書き換えている*/
381+ /*リストの値を書き換えている*/
375382 head->first = aftervarcode;
376383 }
377384 }
378385 else
379386 {
380387 /*変数がカッコ内であれば、*/
388+
389+ /*前もって、varcodeやaftervarcodeの値をスタックに積んでキャッシュしておく*/
390+ stacklist = ST_pair(varcode, stacklist);
391+ stacklistafter = ST_pair(aftervarcode, stacklistafter);
392+
381393 varcode = ST_first(head);
382394 aftervarcode = i;
383395 head->first = aftervarcode;
384396 }
385397 head = ST_second(head);
386398 }
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+ }
387414 }
388415 return true;
389416 }
390417
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+
391426 /*ST_EMPTY
392427 * 空リストを表現する構造体
393428 * クロージャのある他の言語では、関数で実装する*/
@@ -504,7 +539,7 @@ ST_Ordered_Pair *ST_setChurchNumber (uint_fast32_t length, Ord2ST_Ordered_Pair f
504539 }
505540
506541 /*ST_getItem 関数
507- * 入力されたリストの頭からnum番目にある項目の値を取り出す*/
542+ * 入力されたリストの最後からnum番目にある項目の値を取り出す(num >= 0)*/
508543 ST_Ordered_Pair *ST_getItem (ST_Ordered_Pair *list, uint_fast32_t num) {
509544 return ST_setChurchNumber(num, ST_second, list);
510545 }
Binary files a/source_code/shadowstar.o and b/source_code/shadowstar.o differ
--- a/source_code/startest.c
+++ b/source_code/startest.c
@@ -275,6 +275,14 @@ int main(int argc, char **argv)
275275 assert(ST_first(ST_second(varlist)) == ST_first(varlist));
276276 ST_freelist(varlist);
277277
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);
278286
279287
280288 ST_Token_Mode tokenmode = ST_FUNCTION_APPLY_TOKEN;
@@ -341,6 +349,10 @@ int main(int argc, char **argv)
341349
342350 assert(ST_getNumber(ppp, dummy) == 1);
343351 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);
344356 ST_freelist(ppp);
345357
346358 eprint_log("Error!\n");
Binary files a/source_code/startest.o and b/source_code/startest.o differ