From fdcf4be12c7c8913ccd26ebcab7cb05eb2abaa48 Mon Sep 17 00:00:00 2001 From: bd Date: Mon, 4 Nov 2024 23:34:54 -0500 Subject: Add keywords to lexer --- manifest.scm | 1 + src/gscc | 8 +++++--- src/modules/lexer/lexer.scm | 12 +++++++++++- src/unit-tests/lexer/lexer-test.scm | 6 +++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/manifest.scm b/manifest.scm index be6c84e..8d1b86e 100644 --- a/manifest.scm +++ b/manifest.scm @@ -1,5 +1,6 @@ (specifications->manifest '( "gcc-toolchain" + "guile" "python" )) diff --git a/src/gscc b/src/gscc index 8914016..82ed649 100755 --- a/src/gscc +++ b/src/gscc @@ -33,9 +33,11 @@ file on a success." (define (process file parse? assemble?) "Driver for lexing, parsing, and assembly generation." - (let ((port (open-input-file file))) - (set-current-input-port port) - (read-tokens) + (let* ((port (open-input-file file)) + (tokens (begin (set-current-input-port port) + (read-tokens)))) + ;; (when parse? + ;; ) (close-input-port port))) (define (postprocess file dest) diff --git a/src/modules/lexer/lexer.scm b/src/modules/lexer/lexer.scm index e07ab67..dae7107 100644 --- a/src/modules/lexer/lexer.scm +++ b/src/modules/lexer/lexer.scm @@ -30,7 +30,7 @@ current input port." 'semi-colon) ((char-alphabetic? chr) - (read-identifier chr)) + (lookup-keyword (read-identifier chr))) ((char-numeric? chr) (read-constant chr)) @@ -57,3 +57,13 @@ current input port." (read-identifier-helper (cons (read-char) chrs-so-far))) (#t (reverse chrs-so-far))))) (list->string (read-identifier-helper (list chr)))) + +(define (lookup-keyword id) + "Given identifier ID, converts it to a keyword +if one is known." + (let ((found (assoc + id + '(("int" . int) + ("void" . void) + ("return" . return))))) + (if found (cdr found) id))) diff --git a/src/unit-tests/lexer/lexer-test.scm b/src/unit-tests/lexer/lexer-test.scm index eb41b83..48291b9 100644 --- a/src/unit-tests/lexer/lexer-test.scm +++ b/src/unit-tests/lexer/lexer-test.scm @@ -65,8 +65,12 @@ (test-error (read-this "1foo") (read-tokens)) +(test-equal (read-this "void") + '(void) + (read-tokens)) + (test-equal (read-this "int main(void) {return 2;}") - '("int" "main" left-paren "void" right-paren open-brace "return" 2 semi-colon close-brace) + '(int "main" left-paren void right-paren open-brace return 2 semi-colon close-brace) (read-tokens)) -- cgit v1.2.3