diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/gscc | 23 | ||||
-rw-r--r-- | src/modules/lexer/lexer.scm | 31 |
2 files changed, 43 insertions, 11 deletions
@@ -1,9 +1,10 @@ #!/run/current-system/profile/bin/guile \ --e main -s +-L ./src -e main -s !# -(use-modules (ice-9 getopt-long)) +(use-modules (ice-9 getopt-long) + (modules lexer lexer)) (define version "v0.1") @@ -30,8 +31,11 @@ file on a success." (zero? (system (string-concatenate `("gcc -E -P " ,file " -o " ,preprocessed-file-name)))) preprocessed-file-name))) -(define (process file lex? parse? codegen?) - "") +(define (process file parse? assemble?) + "Driver for lexing, parsing, and assembly generation." + (let ((port (open-input-file file))) + (read-tokens-from-port port) + (close-input-port port))) (define (postprocess file dest) "Assembles and links file, producing an executable. @@ -50,7 +54,7 @@ Returns #f on a failure, #t on a success." (file (if (null? rest) #f (car rest)))) (cond ((option-ref options 'version #f) - (display (string-concatenate `("gscc (the 'Guile Scheme C Compiler', " ,version ")")))) + (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)) @@ -58,13 +62,10 @@ Returns #f on a failure, #t on a success." (#t (let ((source (preprocess file))) (when source - (display (string-concatenate `("Preprocess reported success (wrote " ,source ")."))) + (display (string-concatenate `("Preprocess reported success (wrote " ,source ").\n"))) (process source - (option-ref options 'lex #f) - (option-ref options 'parse #f) - (option-ref options 'codegen #f)) - (newline) - (display "Done!"))))))) + (not (option-ref options 'lex #f)) + (not (option-ref options 'parse #f))))))))) ;; Local Variables: diff --git a/src/modules/lexer/lexer.scm b/src/modules/lexer/lexer.scm new file mode 100644 index 0000000..0661fa6 --- /dev/null +++ b/src/modules/lexer/lexer.scm @@ -0,0 +1,31 @@ +(define-module (modules lexer lexer) + #:export (read-tokens-from-port)) + +(define (read-tokens-from-port port) + "" + (display (read-char port))) + +(define (read-token) + + (define (read-token-loop first-char) + (cond + + ((or (char-whitespace? first-char)) + (read-token) + + ((eq? first-char #\() + (cons 'left-paren #\()) + ((eq? first-char #\)) + (cons 'right-paren #\))) + ((eq? first-char #\{) + (cons 'right-bracket #\{)) + ((eq? first-char #\}) + (cons 'right-bracket #\})) + + (#t + (error "illegal lexical syntax"))))) + + (let ((first-char (read-char))) + (if (eof-object? first-char) + '() + (cons (read-token-loop first-char) '())))) |