summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gscc23
-rw-r--r--src/modules/lexer/lexer.scm31
2 files changed, 43 insertions, 11 deletions
diff --git a/src/gscc b/src/gscc
index 801bdfe..7ee1bf1 100755
--- a/src/gscc
+++ b/src/gscc
@@ -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) '()))))