diff options
author | bd <bdunahu@operationnull.com> | 2025-01-18 01:25:47 -0700 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-01-18 01:25:47 -0700 |
commit | ddd448ae86e5730d5cd297f44ec89ee3fa3c0006 (patch) | |
tree | 9eaa2c75b9b397fcef0fe9467d10f21cc1e07a0c /src/modules/parser | |
parent | 1c216bd45a7d4fb529288192ecff46453309c485 (diff) |
use a scheme procedures+eval to manage and transform AST
Removes records for a more-managable scheme-syntax approach. Modules+overriding allows for the IR itself to be represented and evaluated as scheme code during each transformation.
Diffstat (limited to 'src/modules/parser')
-rw-r--r-- | src/modules/parser/driver.scm | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/modules/parser/driver.scm b/src/modules/parser/driver.scm new file mode 100644 index 0000000..8fd42a4 --- /dev/null +++ b/src/modules/parser/driver.scm @@ -0,0 +1,35 @@ +(define-module (modules parser driver) + #:use-module (ice-9 match) + #:export (tokens->ast)) + + +(define (die) + (error "syntax error")) + +(define (tokens->ast tokens) + (match tokens + ((func ...) + (list 'prog (function func))) + (_ (die)))) + +(define (function tokens) + (match tokens + (('int (? string? id) 'left-paren 'void 'right-paren 'open-brace stmt ... 'close-brace) + (list 'func id (statement stmt))) + (_ (die)))) + +(define (statement tokens) + (match tokens + (('return expr ... 'semi-colon) + (list 'stmt (expression expr))) + (_ (die)))) + +(define (expression tokens) + (match tokens + (((? integer? int)) + int) + (((or 'neg 'not) expr ...) + (list 'expr (car tokens) (expression expr))) + (('left-paren expr ... 'right-paren) + (expression expr)) + (_ (die)))) |