source: project/release/4/easyffi/easyffi.l @ 14448

Last change on this file since 14448 was 8422, checked in by Kon Lovett, 13 years ago

Added rest of the C char escapes. Changed ":optional" to "optional". Added '.' operator (what happed here? rlimit used to compile.) Added '.' operator test case.

File size: 9.0 KB
Line 
1; easyffi.l -*- Scheme -*-
2;
3; Copyright (c) 2000-2004, Felix L. Winkelmann
4; All rights reserved.
5;
6; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
7; conditions are met:
8;
9;   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
10;     disclaimer.
11;   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
12;     disclaimer in the documentation and/or other materials provided with the distribution.
13;   Neither the name of the author nor the names of its contributors may be used to endorse or promote
14;     products derived from this software without specific prior written permission.
15;
16; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
19; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24; POSSIBILITY OF SUCH DAMAGE.
25;
26; Send bugs, suggestions and ideas to:
27;
28; felix@call-with-current-continuation.org
29;
30; Felix L. Winkelmann
31; Unter den Gleichen 1
32; 37130 Gleichen
33; Germany
34
35
36letter    [a-zA-Z]
37digit     [0-9]
38digit16   [0-9a-fA-F]
39digit8    [0-7]
40space     [ ]
41
42%%
43
44\\[ ]                              (yycontinue)
45\\?\13?\n                          (if pp-mode
46                                       (begin
47                                         (set! pp-mode #f) 'pp-end)
48                                       (yycontinue) )
49{space}+                           (yycontinue)
50\9+                                (yycontinue)
51\13+                               (yycontinue)
52\12+                               (yycontinue)
53"//"                               (let loop ()
54                                     (let ([c (yygetc)])
55                                       (if (or (eq? 'eof c) (char=? #\newline c))
56                                           (begin
57                                             (if pp-mode
58                                                 (begin
59                                                   (set! pp-mode #f)
60                                                   'pp-end)
61                                                 (yycontinue) ) )
62                                           (loop) ) ) )
63"/*"                               (let loop ([c (yygetc)])
64                                     (cond [(eq? 'eof c) (parsing-error "unexpected end of comment")]
65                                           [(char=? #\newline c) (loop (yygetc))]
66                                           [(char=? c #\*)
67                                            (let ([c2 (yygetc)])
68                                              (if (eq? #\/ c2)
69                                                  (yycontinue)
70                                                  (loop c2) ) ) ]
71                                           [else (loop (yygetc))] ) )
72"enum"                             'enum
73"typedef"                          'typedef
74"extern"                           'extern
75"static"                           'static
76"___fixnum"                         'fixnum
77"___number"                         'number
78"___symbol"                         'symbol
79"___bool"                           'bool
80"___pointer"                       'pointer
81"___u32"                           'u32
82"___s32"                           's32
83"___s64"                           's64
84"int64_t"                          's64
85"__int64"                          's64
86"bool"                             'bool
87"___safe"                           'callback
88"___declare"                        'declare
89"___scheme_value"                   'scheme-value
90"___scheme_pointer"                 'scheme-pointer
91"___byte_vector"                    'byte-vector
92"C_word"                            'scheme-value
93"___abstract"                       'abstract
94"___specialize"                     'specialize
95"___byte"                           'byte
96"___discard"                        'discard
97"___in"                            'in
98"___out"                           'out
99"___inout"                         'inout
100"___mutable"                       'mutable
101"___length"                        'length
102"size_t"                           'size_t
103"int"                              'int
104"unsigned"                         'unsigned
105"signed"                           'signed
106"float"                            'float
107"double"                           'double
108"short"                            'short
109"long"                             'long
110"char"                             'char
111"void"                             'void
112"struct"                           'struct
113"union"                            'union
114"const"                            'const
115"class"                            'class
116"public"                           'public
117"protected"                        'protected
118"private"                          'private
119"volatile"                         'volatile
120"namespace"                        'namespace
121"virtual"                          'virtual
122"explicit"                         'explicit
123"inline"                           'inline
124"using"                            'using
125"@interface"                       'interface
126"@implementation"                  'implementation
127"@end"                             'end
128"@class"                           'objc-class
129"@protocol"                        'protocol
130"@public"                          'objc-public
131"@protected"                       'objc-protected
132"@private"                         'objc-private
133"@encode"                          (list 'id "@encode")
134"@defs"                            (list 'id "@defs")
135"@selector"                        (list 'id "@selector")
136"..."                              'dots
137^[ \t]*#[ ]*define                        (begin (set! pp-mode #t) 'pp-define)
138^[ \t]*#[ ]*include                       (begin (set! pp-mode 'include) 'pp-include)
139^[ \t]*#[ ]*import                        (begin (set! pp-mode 'import) 'pp-import)
140^[ \t]*#[ ]*ifdef                         (begin (set! pp-mode #t) 'pp-ifdef)
141^[ \t]*#[ ]*ifndef                        (begin (set! pp-mode #t) 'pp-ifndef)
142^[ \t]*#[ ]*elif                          (begin (set! pp-mode #t) 'pp-elif)
143^[ \t]*#[ ]*if                            (begin (set! pp-mode #t) 'pp-if)
144^[ \t]*#[ ]*else                          (begin (set! pp-mode #t) 'pp-else)
145^[ \t]*#[ ]*pragma                        (begin (set! pp-mode #t) 'pp-pragma)
146^[ \t]*#[ ]*endif                         (begin (set! pp-mode #t) 'pp-endif)
147^[ \t]*#[ ]*error                         (begin (set! pp-mode #t) 'pp-error)
148^[ \t]*#[ ]*undef                         (begin (set! pp-mode #t) 'pp-undef)
149#                                  '(op "#")
150"if"                               'if
151"else"                             'else
152@?\"                               (let loop ([cs '()])
153                                     (let ([c (yygetc)])
154                                       (cond [(eq? 'eof c)
155                                              (parsing-error "unexpected end of string constant")]
156                                             [(char=? c #\\) (loop (cons (yygetc) cs))]
157                                             [(char=? c #\")
158                                              (list 'string (reverse-list->string cs)) ]
159                                             [else (loop (cons c cs))] ) ) )
160\'\\{digit}{digit}{digit}\'        (list 'char (string->number (substring yytext 3 5) 8))
161\'\\0\'                            '(char #\nul)
162\'\\a\'                            '(char #\alarm)
163\'\\b\'                            '(char #\backspace)
164\'\\f\'                            '(char #\page)
165\'\\n\'                            '(char #\newline)
166\'\\r\'                            '(char #\return)
167\'\\t\'                            '(char #\tab)
168\'\\v\'                            '(char #\vtab)
169\'\\.\'                            (list 'char (string-ref yytext 2))
170\'.\'                              (list 'char (string-ref yytext 1))
171({letter}|_)({letter}|_|{digit})*  (list 'id yytext)
1720(x|X){digit16}+                   (list 'num (string->number (substring yytext 2 (string-length yytext)) 16))
1730{digit8}+                         (list 'num (string->number (substring yytext 1 (string-length yytext)) 8))
174[-+]?{digit}+(\.{digit}*)?([eE][-+]?{digit}+)?
175                                     (list 'num (string->number yytext))
176"<"                                (if (eq? pp-mode 'include)
177                                       (let loop ([s '()])
178                                         (let ([c (yygetc)])
179                                           (cond [(eq? 'eof c) (parsing-error "unexpected end of include file name")]
180                                                 [(char=? #\> c)
181                                                  (set! pp-mode #f)
182                                                  `(i-string ,(reverse-list->string s)) ]
183                                                 [else (loop (cons c s))] ) ) )
184                                       `(op "<") )
185"("                                'open-paren
186")"                                'close-paren
187"["                                'open-bracket
188"]"                                'close-bracket
189"{"                                'open-curly
190"}"                                'close-curly
191","                                'comma
192";"                                'semicolon
193"*"                                'star
194"."|"+="|"-="|">>="|"<<="|"*="|"/="|"%="|"%"|"&="|"|="|"^="|"+"|"-"|"/"|">="|"<="|"=="|"<<"|">>"|"&&"|"||"|"&"|"|"|">"|"<"|"^"|"~"|"?"|"::"|":"|"="|"!="|"!"
195                                     (list 'op yytext)
196<<EOF>>                            (begin (set! pp-mode #f) 'stop)
197<<ERROR>>                          (lexer-error (yygetc))
Note: See TracBrowser for help on using the repository browser.