nyacc: lots of C99/CPP fixes. now more robust for code mode
[mes.git] / module / nyacc / lang / c99 / xparser.scm
1 ;;; nyacc/lang/c99/xparser.scm - copied from parser.scm
2 ;;;
3 ;;; Copyright (C) 2015 Matthew R. Wette
4 ;;;
5 ;;; This program is free software: you can redistribute it and/or modify
6 ;;; it under the terms of the GNU General Public License as published by 
7 ;;; the Free Software Foundation, either version 3 of the License, or 
8 ;;; (at your option) any later version.
9 ;;;
10 ;;; This program is distributed in the hope that it will be useful,
11 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of 
12 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ;;; GNU General Public License for more details.
14 ;;;
15 ;;; You should have received a copy of the GNU General Public License
16 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 ;; C parser
19
20 (define-module (nyacc lang c99 xparser)
21   #:export (parse-cx parse-c99x)
22   #:use-module (nyacc lex)
23   #:use-module (nyacc parse)
24   #:use-module (nyacc lang util)
25   #:use-module (nyacc lang c99 cpp)
26   #:use-module ((srfi srfi-9) #:select (define-record-type))
27   #:use-module ((sxml xpath) #:select (sxpath))
28   )
29
30 (include-from-path "nyacc/lang/c99/mach.d/c99xtab.scm")
31 (include-from-path "nyacc/lang/c99/body.scm")
32 (include-from-path "nyacc/lang/c99/mach.d/c99xact.scm")
33
34 ;; Parse given a token generator.  Uses fluid @code{*info*}.
35 (define raw-parser
36   (make-lalr-parser 
37    (list
38     (cons 'len-v len-v)
39     (cons 'pat-v pat-v)
40     (cons 'rto-v rto-v)
41     (cons 'mtab mtab)
42     (cons 'act-v act-v))))
43
44 (define (run-parse)
45   (let ((info (fluid-ref *info*)))
46     (raw-parser (gen-c-lexer) #:debug (cpi-debug info))))
47
48 ;; @item parse-c99x [#:cpp-defs def-a-list] [#:debug bool]
49 ;; This needs to be explained in some detail.
50 ;; [#:tyns '("foo_t")]
51 (define* (parse-c99x expr-string
52                      #:key
53                      (cpp-defs '())     ; CPP defines
54                      (tn-dict '())      ; typedef dictionary
55                      (xdef? #f)         ; pred to determine expand
56                      (debug #f)         ; debug?
57                      (tyns '()))        ; defined typenames
58   (with-input-from-string expr-string
59     (lambda ()
60       (catch
61        'c99-error
62        (lambda ()
63          (let ((info (make-cpi debug cpp-defs '(".") tn-dict)))
64            (set-cpi-ptl! info (cons tyns (cpi-ptl info)))
65            (with-fluid*
66                *info* info
67                (lambda ()
68                  (raw-parser (gen-c-lexer #:mode 'code #:xdef? xdef?)
69                              #:debug debug)))))
70        (lambda (key fmt . rest)
71          (report-error fmt rest)
72          #f)))))
73
74 (define parse-cx parse-c99x)
75
76 ;; --- last line ---