@@ -75,6 +75,7 @@
7575 %double [%binop val.l sep.l (process-expr-list tail.l)]
7676 ==
7777++ parse-expr
78+ ~& "parse-exp"
7879 %+ knee *expr
7980 |.
8081 %+ cook process-expr-list parse-expr-list
@@ -351,6 +352,7 @@
351352 %- commaed
352353 %+ turn exprlist print-expr
353354++ parse-exprlist
355+ ~& "parse-exprlist"
354356 %+ knee *exprlist
355357 |.
356358 %+ most (ifix [ws ws] com) parse-expr
@@ -436,15 +438,28 @@
436438+$ prefix-expr
437439 $%
438440 [%expr expr]
441+ [%call functioncall]
439442 [%var var]
440443 ==
444+++ parse-simple-prefix-expr
445+ ~& "parse-simple-prefix-expr"
446+ %+ knee *$%([%expr expr] [%var var])
447+ |.
448+ ;~ pose
449+ parse-parened-expr
450+ ::
451+ %+ cook |=([=var] [%var var]) parse-var
452+ ==
441453++ parse-prefix-expr
454+ ~& "parse-prefix-expr"
442455 %+ knee *prefix-expr
443456 |.
457+ ;< prefix=$%([%expr expr] [%var var]) bind parse-simple-prefix-expr
444458 ;~ pose
445− %+ cook |=([=var] [%var var]) parse-var
459+ %+ cook |=(=functioncall [%call functioncall])
460+ (parse-functioncall-args prefix)
446461 ::
447− parse-parened-expr
462+ (easy prefix)
448463 ==
449464++ print-prefix-expr
450465 |= [=prefix-expr]
@@ -457,6 +472,7 @@
457472 (print-expr +.prefix-expr)
458473 ")"
459474 ==
475+ %call (print-functioncall +.prefix-expr)
460476 ==
461477:: stat
462478::
@@ -469,6 +485,7 @@
469485 [%func-call functioncall]
470486 [%while cond=expr body=blok]
471487 [%repeat body=blok cond=expr]
488+ [%if if]
472489 [%break ~]
473490 [%empty ~]
474491 ==
@@ -506,6 +523,10 @@
506523 parse-name
507524 ==
508525 ::
526+ %+ cook
527+ |= =if [%if if]
528+ parse-if
529+ ::
509530 %+ cook
510531 |= =label [%label label]
511532 parse-label
@@ -568,6 +589,73 @@
568589 "until "
569590 (print-expr cond.stat)
570591 ==
592+ %if (print-if +.stat)
593+ ==
594+:: if
595+::
596++$ if [cond=expr body=blok elsa=(list [cond=expr body=blok]) else=(unit blok)]
597+++ print-if
598+ |= =if
599+ ^- tape
600+ %- zing
601+ :~
602+ "if "
603+ (print-expr cond.if)
604+ " then\0a"
605+ (print-blok body.if)
606+ ::
607+ ^- tape
608+ %- zing
609+ %+ turn elsa.if
610+ |= [cond=expr body=blok]
611+ %- zing
612+ :~
613+ "\0aelseif"
614+ (print-expr cond)
615+ " then\0a"
616+ (print-blok body)
617+ ==
618+ ::
619+ ?~ else.if ""
620+ ^- tape
621+ %- zing
622+ :~
623+ "\0aelse\0a"
624+ (print-blok u.else.if)
625+ ==
626+ ::
627+ "\0aend"
628+ ==
629+++ parse-if
630+ %+ knee *if
631+ |.
632+ %+ cook
633+ |= [* cond=expr * body=blok elsa=(list [cond=expr body=blok]) else=(unit blok) *]
634+ [cond body elsa else]
635+ ;~ (glue wss)
636+ (jest 'if')
637+ parse-expr
638+ (jest 'then')
639+ parse-blok
640+ ::
641+ %- star
642+ %+ cook
643+ |= [* cond=expr * body=blok] [cond body]
644+ ;~ (glue wss)
645+ (jest 'elseif')
646+ parse-expr
647+ (jest 'then')
648+ parse-blok
649+ ==
650+ ::
651+ %- punt
652+ %+ cook
653+ |= [* =blok] blok
654+ ;~ (glue wss)
655+ (jest 'else')
656+ parse-blok
657+ ==
658+ (jest 'end')
571659 ==
572660:: functioncall
573661::
@@ -598,22 +686,29 @@
598686++ parse-functioncall
599687 %+ knee *functioncall
600688 |.
601− ;~ pose
602− %+ cook
603− |= [func=prefix-expr =args] [%call func args]
604− ;~ (glue ws)
605− parse-prefix-expr
606− parse-args
607− ==
608− ::
609− %+ cook
610− |= [obj=prefix-expr * method=name =args]
611− [%method obj method args]
612− ;~ (glue ws)
613− parse-prefix-expr
614− (just ':')
615− parse-name
689+ ;< prefix=prefix-expr bind parse-prefix-expr
690+ ~& > prefix
691+ (parse-functioncall-args prefix)
692+++ parse-functioncall-args
693+ ~& "parse-functioncall-args"
694+ |= =prefix-expr
695+ %+ knee *functioncall
696+ |.
697+ ;~ pfix
698+ ws
699+ ;~ pose
700+ %+ cook
701+ |= =args [%call prefix-expr args]
616702 parse-args
703+ ::
704+ %+ cook
705+ |= [* method=name =args]
706+ [%method prefix-expr method args]
707+ ;~ (glue ws)
708+ (just ':')
709+ parse-name
710+ parse-args
711+ ==
617712 ==
618713 ==
619714:: args
@@ -629,6 +724,7 @@
629724 ")"
630725 ==
631726++ parse-args
727+ ~& "parse-args"
632728 %+ knee *args
633729 |.
634730 ;~ pose