nyacc: Move (ice-9 syncase) into cond-expand.
[mes.git] / module / nyacc / lang / c99 / parser.scm
1 ;;; nyacc/lang/c99/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 parser)
21   #:export (parse-c parse-c99 def-xdef? std-dict)
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 (cond-expand
31  (guile-2)
32  (guile
33   (use-modules (ice-9 syncase))
34   (use-modules (ice-9 optargs)))
35  (mes))
36
37 (include-from-path "nyacc/lang/c99/mach.d/c99tab.scm")
38 (include-from-path "nyacc/lang/c99/body.scm")
39 (include-from-path "nyacc/lang/c99/mach.d/c99act.scm")
40
41 ;; Parse given a token generator.  Uses fluid @code{*info*}.
42 (define raw-parser
43   (make-lalr-parser 
44    (list
45     (cons 'len-v len-v)
46     (cons 'pat-v pat-v)
47     (cons 'rto-v rto-v)
48     (cons 'mtab mtab)
49     (cons 'act-v act-v))))
50
51 (define (run-parse)
52   (let ((info (fluid-ref *info*)))
53     (raw-parser (gen-c-lexer) #:debug (cpi-debug info))))
54
55 ;; @item parse-c [#:cpp-defs def-a-list] [#:inc-dirs dir-list] [#:debug bool] \
56 ;;               [#:mode ('code|'file)]
57 ;; This needs to be explained in some detail.
58 ;; tdd = typedef dict: (("<time>" time_t) ... ("<unistd.h>" ...))
59 (define* (parse-c99 #:key
60                     (cpp-defs '())      ; CPP defines
61                     (inc-dirs '())      ; include dirs
62                     (td-dict '())       ; typedef dictionary
63                     (mode 'file)        ; mdoe: 'file or 'code
64                     (xdef? #f)          ; pred to determine expand
65                     (debug #f))         ; debug
66   (catch
67    'parse-error
68    (lambda ()
69      (let ((info (make-cpi debug cpp-defs (cons "." inc-dirs) td-dict)))
70        (with-fluid*
71            *info* info
72            (lambda ()
73              (raw-parser (gen-c-lexer #:mode mode #:xdef? xdef?)
74                          #:debug debug)))))
75    (lambda (key fmt . rest)
76      (apply simple-format (current-error-port) (string-append fmt "\n") rest)
77      #f)))
78
79 (define parse-c parse-c99)
80
81 ;; --- last line ---