; -*- Hen -*- (require-extension lalr) (define expr-parser (lalr-parser (output: expr-parser "expr.grm.scm") ;; --- token definitions ( ID NUM LET IF THEN ELSE RPAREN (nonassoc: LPAREN) (right: QUESTION COLON COMMA) (left: < > = <= >=) (left: + -) (left: * /) (left: uminus) (right: ^ ) ) (expr (NUM) : (exact->inexact $1) (ID) : $1 (ID LPAREN RPAREN) : `(,$1) (ID LPAREN args RPAREN) : `(,$1 . ,(reverse $3)) (expr + expr) : `(+ ,$1 ,$3) (expr - expr) : `(- ,$1 ,$3) (expr * expr) : `(* ,$1 ,$3) (expr / expr) : `(/ ,$1 ,$3) (- expr (prec: uminus)) : `(- ,$2) (expr ^ expr) : `(pow ,$1 ,$3) (expr > expr) : `(> ,$1 ,$3) (expr < expr) : `(< ,$1 ,$3) (expr < = expr) : `(<= ,$1 ,$4) (expr > = expr) : `(>= ,$1 ,$4) (expr <= expr) : `(<= ,$1 ,$3) (expr >= expr) : `(>= ,$1 ,$3) (expr QUESTION expr COLON expr) : `(if ,$1 ,$3 ,$5) (LET LPAREN bnds RPAREN expr) : `(let ,(reverse $3) ,$5) (IF expr THEN expr ELSE expr) : `(if ,$2 ,$4 ,$6) (LPAREN expr RPAREN) : $2 ) (args (expr) : (list $1) (args COMMA expr) : (cons $3 $1) (args expr) : (cons $2 $1)) (bnds (binding) : (list $1) (bnds binding) : (cons $2 $1)) (binding (LPAREN ID expr RPAREN) : (list $2 $3)) ))