nyacc: lex fixes for char-lit
authorMatt Wette <matt.wette@gmail.com>
Fri, 3 Mar 2017 00:23:44 +0000 (16:23 -0800)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 3 Mar 2017 00:23:44 +0000 (16:23 -0800)
module/nyacc/lang/c99/BUGS
module/nyacc/lang/c99/parser.scm
module/nyacc/lang/c99/pprint.scm
module/nyacc/lang/c99/xparser.scm
module/nyacc/lex.scm

index 2e693c1da08fdcdb343c2d92355e6f930ac7d8c1..4ae98f0b02261062dbdfc3ce154b6ffe4235472b 100644 (file)
@@ -1,11 +1,13 @@
-C99-008        <= next id
+BUGs and TODOs
+
+C99-009        <= next id
+
+C99-008        02 Mar 2017, M.Wette
+       clean up error traps among raw-parser run-parse and parse-c99[x]
 
 C99-007        16 Feb 2017, M.Wette
        cpp.scm: does __LINE__ get expanded?
 
-C99-006        06 Aug 2016, M.Wette
-        code "val = '\0';" gets pprinted to "val = '^@;';"
-
 C99-005        26 Jun 2016, M.Wette
        in util2.scm, tree->udecl needs to return "struct" and "union"
        entries for stuff like
@@ -38,5 +40,8 @@ C99-002 CPP redesign is not working for ifdef and defined:
              (lambda (iden)
 25Jun16 fixed
 
+C99-006        06 Aug 2016, M.Wette
+        code "val = '\0';" gets pprinted to "val = '^@;';"
+02Mar17        fixed, V0.76.5+c99dev
 
 --- last line ---
index 3b279c8e84a4f6c43768f55d787215d761f7dd5a..532991b502730bc05e8086d037432a34823b968f 100644 (file)
 ;; Parse given a token generator.  Uses fluid @code{*info*}.
 ;; A little ugly wrt re-throw but
 (define raw-parser
-  (let ((c99-parser (make-lalr-parser
+  (let ((parser (make-lalr-parser
                     (list (cons 'len-v len-v) (cons 'pat-v pat-v)
                           (cons 'rto-v rto-v) (cons 'mtab mtab)
                           (cons 'act-v act-v)))))
     (lambda* (lexer #:key (debug #f))
       (catch
        'nyacc-error
-       (lambda () (c99-parser lexer #:debug debug))
+       (lambda () (parser lexer #:debug debug))
        (lambda (key fmt . args)
         (report-error fmt args)
         (pop-input)                    ; not sure this is the right way
-        (throw 'c99-error "C99 parse error")))
-      )))
+        (throw 'c99-error "C99 parse error"))))))
 
 ;; This is used to parse included files at top level.
 (define (run-parse)
index e0bab69c080894ffc23be9220087fe8929ae9903..91e2612800a57210e18d24729b2183c6ca07fabb 100644 (file)
           cond assn-expr)
     (nonassoc)))
 
+;; @deffn {Procedure} scmchs->c scm-chr-str => c-chr-str
+;; Convert 1-char scheme string into 1-char C string constant as typed by user.
+;; That is, exscaped.
+;; @example
+;; (scmchstr->c "#x00") => "\\0"
+;; @end example
+;; @end deffn
+(define (scmchs->c scm-chr-str)
+  (let ((ch (string-ref scm-chr-str 0)))
+    (case ch
+      ((#\nul) "\\0")
+      ((#\alarm) "\\a")
+      ((#\backspace) "\\b")
+      ((#\tab) "\\t")
+      ((#\newline) "\\n")
+      ((#\vtab) "\\v")
+      ((#\page) "\\f")
+      ((#\\) "\\")
+      (else scm-chr-str))))
+
 (define protect-expr? (make-protect-expr op-prec op-assc))
 
 ;; @deffn pretty-print-c99 tree [#:indent-level 2]
 
       ((p-expr ,expr) (ppx expr))
       ((ident ,name) (sf "~A" name))
-      ((char ,value) (sf "'~A'" (sx-ref tree 1)))
+      ((char ,value) (sf "'~A'" (scmchs->c (sx-ref tree 1))))
       ((fixed ,value) (sf "~A" value))
       ((float ,value) (sf "~A" value))
 
index d7c5ccfa7877c3e9fae7e2470e67e0ab6802c360..b30065e000cd876e39f7110ea84b6ab9f9ecfd01 100644 (file)
 
 ;; Parse given a token generator.  Uses fluid @code{*info*}.
 (define raw-parser
-  (make-lalr-parser 
-   (list
-    (cons 'len-v len-v)
-    (cons 'pat-v pat-v)
-    (cons 'rto-v rto-v)
-    (cons 'mtab mtab)
-    (cons 'act-v act-v))))
+  (let ((parser (make-lalr-parser 
+                (list (cons 'len-v len-v) (cons 'pat-v pat-v)
+                      (cons 'rto-v rto-v) (cons 'mtab mtab)
+                      (cons 'act-v act-v)))))
+    (lambda* (lexer #:key (debug #f))
+      (catch
+       'nyacc-error
+       (lambda () (parser lexer #:debug debug))
+       (lambda (key fmt . args)
+        (report-error fmt args)
+        (pop-input)                    ; not sure this is right
+        (throw 'c99-error "C99 parse error"))))))
 
 (define (run-parse)
   (let ((info (fluid-ref *info*)))
index 3974a0ff426a5b4e63b3397b91004df0615b5f22..bedfd5fef96d6f6f1aad4f20cbad7af8cd4da73a 100644 (file)
              ((eq? ch #\") (cons '$string (lsr cl)))
              (else (iter (cons ch cl) (read-char)))))))
 
-;; @deffn make-chlit-reader
+;; @deffn {Procedure} make-chlit-reader
 ;; Generate a reader for character literals. NOT DONE.
 ;; For C, this reads @code{'c'} or @code{'\n'}.
+;; @end deffn
 (define (make-chlit-reader . rest) (error "NOT IMPLEMENTED"))
 
-;; @deffn read-c-chlit ch
+;; @deffn {Procedure} read-c-chlit ch
 ;; @example
 ;; ... 'c' ... => (read-c-chlit #\') => '($ch-lit . #\c)
 ;; @end example
+;; @end deffn
 (define (read-c-chlit ch)
   (if (not (eqv? ch #\')) #f
       (let ((c1 (read-char)) (c2 (read-char)))
            (let ((c3 (read-char)))
              (cons '$chlit
                    (case c2
-                     ((#\0) "\0;")        ; nul U+0000 (#\U+...)
+                     ((#\0) "\0")         ; nul U+0000 (#\U+...)
                      ((#\a) "\a")         ; alert U+0007
                      ((#\b) "\b")         ; backspace U+0008
                      ((#\t) "\t")         ; horizontal tab U+0009