From 4230b1824fa484286a13bb55068b63ad3656b0bd Mon Sep 17 00:00:00 2001 From: Alex Karle Date: Wed, 5 Oct 2022 20:54:20 -0400 Subject: [PATCH] parser: Add basic parser types from ch. 5 This gets interesting because I'm not really trying to implement the visitor pattern in Scheme. Setting the record printers feels awfully like Java's toString() though --- fisl.scm | 3 +++ parser.scm | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 parser.scm diff --git a/fisl.scm b/fisl.scm index 277ae26..3094da1 100755 --- a/fisl.scm +++ b/fisl.scm @@ -2,14 +2,17 @@ ;; fisl -- fisl is scheme lox (load "scanner.scm") (load "util.scm") +(load "parser.scm") (import (chicken io) (chicken base) (chicken format) scanner + parser util) (define (run code fname) + (parse) (map print (scan code fname))) (define (run-prompt) diff --git a/parser.scm b/parser.scm new file mode 100644 index 0000000..d0b8ee1 --- /dev/null +++ b/parser.scm @@ -0,0 +1,25 @@ +(module parser (parse) + + (import scheme + (chicken base) + (chicken format)) + + (define-record binary left operator right) + (set-record-printer! binary + (lambda (x out) (fprintf out "(~S ~S ~S)" (binary-operator x) (binary-left x) (binary-right x)))) + + (define-record grouping expression) + (set-record-printer! grouping + (lambda (x out) (fprintf out "(group ~S)" (grouping-expression x)))) + + (define-record literal value) + (set-record-printer! literal + (lambda (x out) (fprintf out "~S" (literal-value x)))) + + (define-record unary operator right) + (set-record-printer! unary + (lambda (x out) (fprintf out "(~S ~S)" (unary-operator x) (unary-right x)))) + + (define (parse) + (print (make-binary (make-unary "-" (make-literal 123)) "*" (make-grouping (make-literal 42))))) +) -- libgit2 1.1.1