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