From c63a873fe7fbf7947e07acfaf2402fe85100deba Mon Sep 17 00:00:00 2001 From: bd Date: Tue, 28 Jan 2025 11:01:47 -0500 Subject: Rename gscc to 'ull' --- .dir-locals.el | 2 +- manifest.scm | 24 +++++++++---- src/gscc | 107 --------------------------------------------------------- src/ull | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 114 deletions(-) delete mode 100755 src/gscc create mode 100755 src/ull diff --git a/.dir-locals.el b/.dir-locals.el index cb836da..ba479e9 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,4 +1,4 @@ ;;; Directory Local Variables -*- no-byte-compile: t -*- ;;; For more information see (info "(emacs) Directory Variables") -((scheme-mode . ((compile-command . "guix shell -m manifest.scm -- ./writing-a-c-compiler-tests/test_compiler ./src/gscc --chapter 1 --stage lex")))) +((scheme-mode . ((compile-command . "guix shell -m manifest.scm -- ./writing-a-c-compiler-tests/test_compiler ./src/ull --chapter 1 --stage lex")))) diff --git a/manifest.scm b/manifest.scm index 8d1b86e..54ab185 100644 --- a/manifest.scm +++ b/manifest.scm @@ -1,6 +1,18 @@ -(specifications->manifest - '( - "gcc-toolchain" - "guile" - "python" - )) +(use-modules (gnu packages bison) + (gnu packages flex) + (gnu packages commencement) + (gnu packages base) + (gnu packages python) + (gnu packages guile) + (gnu packages pkg-config)) + +(packages->manifest + (list + bison + flex + gcc-toolchain + gnu-make + guile-next + pkg-config + python + )) diff --git a/src/gscc b/src/gscc deleted file mode 100755 index 41cbbed..0000000 --- a/src/gscc +++ /dev/null @@ -1,107 +0,0 @@ -#!/run/current-system/profile/bin/guile \ --L ./src/modules -e main -s -!# - - -(use-modules (ice-9 getopt-long) - (ice-9 popen) - (ice-9 pretty-print) - (lexer driver) - (parser driver) - (tacky driver) - (generator driver) - (emitter driver)) - - -(define version "v0.1.1") - - -(define (error message) - (display (string-concatenate `(,message " -Usage: - gscc [OPTIONS] file -Options: - --version, -v: print version information - --debug, -d: turn on verbose output - --lex, -l: run the lexer, but stop before assembly generation - --parse, -p: run the lexer and parser, but stop before assembly generation - --tacky, -t: run the tacky generation stage, but stop before assembly generation - --codegen, -c: perform lexing, parsing, tacky, and assembly generation, but stop before code emission\n"))) - (exit #f)) - -(define (c-extension? file) - (let ((extension (string-drop file (- (string-length file) 2)))) - (string=? extension ".c"))) - -(define (process file parse? tack? generate? write? dest) - "Driver for lexing, parsing, and assembly generation." - (let* ((port (preprocess file)) - (tokens (begin (set-current-input-port port) - (read-tokens)))) - (close-input-port port) - (when parse? - (let ((c-ast (tokens->ast tokens))) - (pretty-print c-ast) - (when tack? - (let ((tacky-ast (ast->tacky c-ast))) - (pretty-print tacky-ast) - (when generate? - (let ((assembly-ast (tacky->assembly tacky-ast))) - (pretty-print assembly-ast) - (when write? - (let ((program (assembly->string assembly-ast)) - (a-file (string-append dest ".s"))) - (when (file-exists? a-file) - (delete-file a-file)) - (let ((port (open-output-file a-file))) - (display program port) - (close-port port)) - (when (postprocess a-file dest) - (display (string-concatenate `("Postprocess reported success (wrote " ,dest ").\n")))) - )))))))))) - -(define (preprocess file) - "Returns an input port containing FILE processed with gcc." - (open-input-pipe (string-append "gcc -E -P " file))) - -(define (postprocess src dest) - "Assembles and links SRC, producing executable DEST. -Returns #f on a failure, #t on a success." - (zero? (system (string-concatenate `("gcc " ,src " -o " ,dest))))) - -(define (main args) - "Entry point for the gscc. Handles user args and performs initial validity check." - (let* ((option-spec - '((version (single-char #\v) (value #f)) - (debug (single-char #\d) (value #f)) - (lex (single-char #\l) (value #f)) - (parse (single-char #\p) (value #f)) - (tacky (single-char #\t) (value #f)) - (codegen (single-char #\c) (value #f)))) - (options (getopt-long args option-spec)) - (rest (option-ref options '() #f)) - (file (if (null? rest) #f (car rest)))) - (cond - ((option-ref options 'version #f) - (display (string-concatenate `("gscc (the 'Guile Scheme C Compiler', " ,version ")\n")))) - ((not (equal? 1 (length rest))) (error "Wrong number of arguments.")) - ((or (not file) - (not (access? file R_OK)) - (not (equal? 'regular (stat:type (stat file)))) - (not (c-extension? file))) (error "The file could not be read, or it is not a C source code file.")) - (#t - (let ((parse? (not (option-ref options 'lex #f))) - (tack? (not (option-ref options 'parse #f))) - (generate? (not (option-ref options 'tacky #f))) - (write? (not (option-ref options 'codegen #f)))) - (process file - parse? - tack? - generate? - write? - (string-drop-right file 2))))))) - - -;; Local Variables: -;; mode: scheme -;; End: diff --git a/src/ull b/src/ull new file mode 100755 index 0000000..f878c4e --- /dev/null +++ b/src/ull @@ -0,0 +1,107 @@ +#!/run/current-system/profile/bin/guile \ +-L ./src/modules -e main -s +!# + + +(use-modules (ice-9 getopt-long) + (ice-9 popen) + (ice-9 pretty-print) + (lexer driver) + (parser driver) + (tacky driver) + (generator driver) + (emitter driver)) + + +(define version "v0.1.1") + + +(define (error message) + (display (string-concatenate `(,message " +Usage: + ull [OPTIONS] file +Options: + --version, -v: print version information + --debug, -d: turn on verbose output + --lex, -l: run the lexer, but stop before assembly generation + --parse, -p: run the lexer and parser, but stop before assembly generation + --tacky, -t: run the tacky generation stage, but stop before assembly generation + --codegen, -c: perform lexing, parsing, tacky, and assembly generation, but stop before code emission\n"))) + (exit #f)) + +(define (c-extension? file) + (let ((extension (string-drop file (- (string-length file) 2)))) + (string=? extension ".c"))) + +(define (process file parse? tack? generate? write? dest) + "Driver for lexing, parsing, and assembly generation." + (let* ((port (preprocess file)) + (tokens (begin (set-current-input-port port) + (read-tokens)))) + (close-input-port port) + (when parse? + (let ((c-ast (tokens->ast tokens))) + (pretty-print c-ast) + (when tack? + (let ((tacky-ast (ast->tacky c-ast))) + (pretty-print tacky-ast) + (when generate? + (let ((assembly-ast (tacky->assembly tacky-ast))) + (pretty-print assembly-ast) + (when write? + (let ((program (assembly->string assembly-ast)) + (a-file (string-append dest ".s"))) + (when (file-exists? a-file) + (delete-file a-file)) + (let ((port (open-output-file a-file))) + (display program port) + (close-port port)) + (when (postprocess a-file dest) + (display (string-concatenate `("Postprocess reported success (wrote " ,dest ").\n")))) + )))))))))) + +(define (preprocess file) + "Returns an input port containing FILE processed with gcc." + (open-input-pipe (string-append "gcc -E -P " file))) + +(define (postprocess src dest) + "Assembles and links SRC, producing executable DEST. +Returns #f on a failure, #t on a success." + (zero? (system (string-concatenate `("gcc " ,src " -o " ,dest))))) + +(define (main args) + "Entry point for ull. Handles user args and performs initial validity check." + (let* ((option-spec + '((version (single-char #\v) (value #f)) + (debug (single-char #\d) (value #f)) + (lex (single-char #\l) (value #f)) + (parse (single-char #\p) (value #f)) + (tacky (single-char #\t) (value #f)) + (codegen (single-char #\c) (value #f)))) + (options (getopt-long args option-spec)) + (rest (option-ref options '() #f)) + (file (if (null? rest) #f (car rest)))) + (cond + ((option-ref options 'version #f) + (display (string-concatenate `("ull (" ,version ")\n")))) + ((not (equal? 1 (length rest))) (error "Wrong number of arguments.")) + ((or (not file) + (not (access? file R_OK)) + (not (equal? 'regular (stat:type (stat file)))) + (not (c-extension? file))) (error "The file could not be read, or it is not a C source code file.")) + (#t + (let ((parse? (not (option-ref options 'lex #f))) + (tack? (not (option-ref options 'parse #f))) + (generate? (not (option-ref options 'tacky #f))) + (write? (not (option-ref options 'codegen #f)))) + (process file + parse? + tack? + generate? + write? + (string-drop-right file 2))))))) + + +;; Local Variables: +;; mode: scheme +;; End: -- cgit v1.2.3