|
41 | 41 | Scheme+/plus-minus-parser
|
42 | 42 | Scheme+/atom
|
43 | 43 | Scheme+/in-equalities
|
| 44 | + Scheme+/n-arity |
44 | 45 | )
|
45 | 46 |
|
46 | 47 |
|
|
426 | 427 |
|
427 | 428 | ;; we can check for expressions like 2<3<=3 here or later in the 'else of next 'if
|
428 | 429 |
|
429 |
| - (define rv |
430 |
| - |
431 |
| - (begin |
432 |
| - ;;(display "!*prec-generic-infix-parser : rv : deep-terms:") (display deep-terms) (newline) |
433 |
| - ;; test for simple-infix (no operator precedence) |
434 |
| - (if (simple-infix-list-syntax? deep-terms) |
435 |
| - |
436 |
| - (begin |
437 |
| - ;; (display "!*prec-generic-infix-parser : deep-terms is a simple infix list") (newline) |
438 |
| - ;; (display "!*prec-generic-infix-parser : deep-terms=") (display deep-terms) (newline) |
439 |
| - (return ;; list ; we put it in a list because rv2 take the car... or use return to skip list decapsulation |
440 |
| - (cons (cadr deep-terms) ; cadr is op in arg1 op arg2 op .... |
441 |
| - (alternating-parameters deep-terms)))) |
442 |
| - |
443 |
| - (begin |
444 |
| - ;; (display "!*prec-generic-infix-parser : deep-terms is not a simple infix list") (newline) |
445 |
| - ;; (display "!*prec-generic-infix-parser : deep-terms=") (display deep-terms) (newline) |
446 |
| - ;; (newline) |
447 |
| - |
448 |
| - ;; we can check for expressions like 2<3<=3 here |
449 |
| - (when (multiple-in-equalities? deep-terms) |
450 |
| - (return (infix->prefix-in-equality deep-terms))) |
| 430 | + ;;(display "!*prec-generic-infix-parser : rv : deep-terms:") (display deep-terms) (newline) |
| 431 | + ;; test for simple-infix (no operator precedence) |
| 432 | + (when (simple-infix-list-syntax? deep-terms) |
| 433 | + ;; (display "!*prec-generic-infix-parser : deep-terms is a simple infix list") (newline) |
| 434 | + ;; (display "!*prec-generic-infix-parser : deep-terms=") (display deep-terms) (newline) |
| 435 | + (return ;; list ; we put it in a list because rv2 take the car... or use return to skip list decapsulation |
| 436 | + (cons (cadr deep-terms) ; cadr is op in arg1 op arg2 op .... |
| 437 | + (alternating-parameters deep-terms)))) |
| 438 | + |
| 439 | + ;; (display "!*prec-generic-infix-parser : deep-terms is not a simple infix list") (newline) |
| 440 | + ;; (display "!*prec-generic-infix-parser : deep-terms=") (display deep-terms) (newline) |
| 441 | + ;; (newline) |
| 442 | + |
| 443 | + ;; we can check for expressions like 2<3<=3 here |
| 444 | + (when (multiple-in-equalities? deep-terms) |
| 445 | + (return (infix->prefix-in-equality deep-terms))) |
451 | 446 |
|
452 |
| - (when (not (infix-canonical? deep-terms)) |
453 |
| - (error "infix-with-precedence-to-prefix.rkt : !*prec-generic-infix-parser : not a canonical infix expression: " deep-terms)) |
| 447 | + (when (not (infix-canonical? deep-terms)) |
| 448 | + (error "infix-with-precedence-to-prefix.rkt : !*prec-generic-infix-parser : not a canonical infix expression: " deep-terms)) |
454 | 449 |
|
455 |
| - (pre-check-!*-generic-infix-parser deep-terms creator))))) |
| 450 | + (define rv (pre-check-!*-generic-infix-parser deep-terms creator)) |
456 | 451 |
|
457 | 452 |
|
458 | 453 | ;; (display "!*prec-generic-infix-parser : rv=") (display rv) (newline)
|
459 | 454 |
|
460 | 455 | ;; (newline)
|
461 | 456 | ;; (newline)
|
462 | 457 |
|
463 |
| - (define rv2 (car rv)) |
464 |
| - ;;(display "!*prec-generic-infix-parser : (car rv) = rv2 =") (display rv2) (newline) |
| 458 | + (define expr (car rv)) |
| 459 | + ;;(display "!*prec-generic-infix-parser : (car rv) = expr =") (display expr) (newline) |
| 460 | + |
| 461 | + ;; TODO pass to n-arity also arithmetic expressions (+ , * , ...) note: fail with n-arity |
| 462 | + ;; note: some overloaded arithmetic operator could not have implemented the n-arity |
| 463 | + ;; perheaps write this in another module ,sort of !*post-generic-infix-parser |
| 464 | + (if ;;(not (isEXPONENTIAL? expr)) |
| 465 | + (or (isDEFINE? expr) |
| 466 | + (isASSIGNMENT? expr)) |
| 467 | + |
| 468 | + ;; make n-arity for <- and <+ only (because could be false with ** , but not implemented in n-arity for now) |
| 469 | + ;; (begin |
| 470 | + ;; (display "!*prec-generic-infix-parser : calling n-arity on expr :") (display expr) (newline) |
| 471 | + (n-arity ;; this avoids : '{x <- y <- z <- t <- u <- 3 * 4 + 1} |
| 472 | + ;; SRFI-105.scm : !0 result = (<- (<- (<- (<- (<- x y) z) t) u) (+ (* 3 4) 1)) ;; fail set! ... |
| 473 | + ;; transform in : '(<- x y z t u (+ (* 3 4) 1)) |
| 474 | + expr) ;) ; end begin |
| 475 | + |
| 476 | + expr) |
465 | 477 |
|
466 |
| - rv2) |
| 478 | + ) ; end def |
467 | 479 |
|
468 | 480 |
|
469 | 481 |
|
|
0 commit comments