]> git.draconx.ca Git - gob-dx.git/blob - src/lexer.l
Release 0.90.3
[gob-dx.git] / src / lexer.l
1 /* GOB C Preprocessor
2  * Copyright (C) 1999 the Free Software Foundation.
3  *
4  * Author: George Lebl
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the  Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19  * USA.
20  */
21 %{
22
23 #include "config.h"
24 #include <glib.h>
25
26 #include "parse.h"
27
28 static int parenth_depth = 0;
29 static int before_comment = INITIAL;
30 static int class_after_c = FALSE;
31 static int header_c = FALSE;
32
33 static GString *cbuf = NULL;
34 int ccode_line = 1;
35
36 int line_no = 1;
37
38 static void
39 clear_cbuf(void)
40 {
41         if(!cbuf) {
42                 cbuf = g_string_new("");
43         } else {
44                 cbuf = g_string_assign(cbuf,"");
45         }
46 }
47
48 static void
49 add_to_cbuf(char *s)
50 {
51         if(!cbuf) {
52                 cbuf = g_string_new(s);
53         } else {
54                 cbuf = g_string_append(cbuf,s);
55         }
56 }
57
58 %}
59
60 %x COMMENT
61 %x C_CODE
62 %x C_CODE_STRING
63 %x CLASS_CODE
64 %x CLASS_CODE_I
65
66 %%
67
68 <*>\n                   { line_no++; REJECT; }
69
70 <*>MOTHERFUCKER         { fprintf(stderr,"You are a bad bad person!\n"); REJECT; }
71
72 \/\/.*$                 { ; /*comment, ignore*/ }
73 <C_CODE>\/\/.*$         { add_to_cbuf(yytext); /*comment, ignore*/ }
74 <CLASS_CODE>\/\/.*$     { ; /*comment, ignore*/ }
75 <CLASS_CODE_I>\/\/.*$   { ; /*comment, ignore*/ }
76 \/\*            {BEGIN(COMMENT); before_comment = INITIAL; }
77 <C_CODE>\/\*    {
78         add_to_cbuf(yytext);
79         BEGIN(COMMENT);
80         before_comment = C_CODE;
81 }
82 <CLASS_CODE>\/\*        {BEGIN(COMMENT); before_comment = CLASS_CODE; }
83 <CLASS_CODE_I>\/\*      {BEGIN(COMMENT); before_comment = CLASS_CODE_I; }
84 <COMMENT>\*\/   {
85         if(before_comment == C_CODE) add_to_cbuf(yytext);
86         BEGIN(before_comment);
87                 }
88 <COMMENT>.      {
89         /* comment, ignore */
90         if(before_comment == C_CODE) add_to_cbuf(yytext);
91                 }
92 <COMMENT>\n     {
93         /* comment, ignore */
94         if(before_comment == C_CODE) add_to_cbuf(yytext);
95                 }
96
97 ^\%h\{          {
98                         BEGIN(C_CODE);
99                         parenth_depth = 1;
100                         class_after_c = FALSE;
101                         header_c = TRUE;
102                         clear_cbuf();
103                         ccode_line = line_no;
104                 }
105 ^\%\{           {
106                         BEGIN(C_CODE);
107                         parenth_depth = 1;
108                         class_after_c = FALSE;
109                         header_c = FALSE;
110                         clear_cbuf();
111                         ccode_line = line_no;
112                 }
113 <C_CODE>^\%\}   {
114                         BEGIN(INITIAL);
115                         yylval.cbuf = cbuf;
116                         cbuf = NULL;
117                         if(header_c)
118                                 return HCODE;
119                         else
120                                 return CCODE;
121                 }
122
123 <C_CODE>\'\{\'          { add_to_cbuf(yytext); }
124 <C_CODE>\'\\\{\'        { add_to_cbuf(yytext); }
125 <C_CODE>\'\}\'          { add_to_cbuf(yytext); }
126 <C_CODE>\'\\\}\'        { add_to_cbuf(yytext); }
127 <C_CODE>\'\"\'          { add_to_cbuf(yytext); }
128 <C_CODE>\'\\\"\'        { add_to_cbuf(yytext); }
129         
130 <C_CODE>\\.     { add_to_cbuf(yytext); }
131 <C_CODE>\"      {
132                         BEGIN(C_CODE_STRING);
133                         add_to_cbuf(yytext);
134                 }
135 <C_CODE_STRING>\\.      { add_to_cbuf(yytext); }
136 <C_CODE_STRING>\"       {
137                                 BEGIN(C_CODE);
138                                 add_to_cbuf(yytext);
139                         }
140 <C_CODE_STRING>.        { add_to_cbuf(yytext); }
141 <C_CODE_STRING>\n       { add_to_cbuf(yytext); }
142
143 <C_CODE>\{      {
144                         parenth_depth++;
145                         add_to_cbuf(yytext);
146                 }
147 <C_CODE>\}      {
148                         parenth_depth--;
149                         if(parenth_depth<0) {
150                                 REJECT;
151                         } else if(parenth_depth==0 && class_after_c) {
152                                 BEGIN(CLASS_CODE_I);
153                                 yylval.cbuf = cbuf;
154                                 cbuf = NULL;
155                                 return CCODE;
156                         }
157                         add_to_cbuf(yytext);
158                 }
159
160 <C_CODE>.       { add_to_cbuf(yytext); }
161 <C_CODE>\n      { add_to_cbuf(yytext); }
162
163 class           {
164                         BEGIN(CLASS_CODE);
165                         return CLASS;
166                 }
167
168 <CLASS_CODE>from        {return FROM;}
169
170 <CLASS_CODE_I>void      {return VOID;}
171 <CLASS_CODE_I>struct    {return STRUCT;}
172 <CLASS_CODE_I>union     {return UNION;}
173 <CLASS_CODE_I>enum      {return ENUM;}
174 <CLASS_CODE_I>signed    {return SIGNED;}
175 <CLASS_CODE_I>unsigned  {return UNSIGNED;}
176 <CLASS_CODE_I>long      {return LONG;}
177 <CLASS_CODE_I>short     {return SHORT;}
178 <CLASS_CODE_I>int       {return INT;}
179 <CLASS_CODE_I>float     {return FLOAT;}
180 <CLASS_CODE_I>double    {return DOUBLE;}
181 <CLASS_CODE_I>char      {return CHAR;}
182 <CLASS_CODE_I>const     {return CONST;}
183
184 <CLASS_CODE_I>\.\.\.    {return THREEDOTS;}
185
186 <CLASS_CODE_I>public    {yylval.line = line_no; return PUBLIC;}
187 <CLASS_CODE_I>private   {yylval.line = line_no; return PRIVATE;}
188 <CLASS_CODE_I>argument  {yylval.line = line_no; return ARGUMENT;}
189 <CLASS_CODE_I>virtual   {yylval.line = line_no; return VIRTUAL;}
190 <CLASS_CODE_I>signal    {yylval.line = line_no; return SIGNAL;}
191 <CLASS_CODE_I>override  {yylval.line = line_no; return OVERRIDE;}
192 <CLASS_CODE_I>onerror   {return ONERROR;}
193 <CLASS_CODE_I>0|[1-9][0-9]*|0x[0-9a-fA-F]+|0[0-7]+|[0-9]*\.[0-9]+|\.[0-9][0-9]* {
194                         yylval.id = g_strdup(yytext);
195                         return NUMBER;
196                 }
197 <CLASS_CODE,CLASS_CODE_I>:?[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+      {
198                         yylval.id = g_strdup(yytext);
199                         return TYPETOKEN;
200                 }
201 <CLASS_CODE,CLASS_CODE_I>[A-Za-z_][A-Za-z0-9_]* {
202                         yylval.id = g_strdup(yytext);
203                         return TOKEN;
204                 }
205
206 <CLASS_CODE>\{  {
207                         BEGIN(CLASS_CODE_I);
208                         return '{';
209                 }
210 <CLASS_CODE_I>\{        {
211                         BEGIN(C_CODE);
212                         parenth_depth=1;
213                         class_after_c = TRUE;
214                         ccode_line = line_no;
215                         yylval.line = line_no;
216                         return '{';
217                 }
218 <CLASS_CODE_I>\}        {
219                                 BEGIN(INITIAL);
220                                 return '}';
221                         }
222
223 <CLASS_CODE,CLASS_CODE_I,INITIAL>[\t ]  ;  /*ignore*/
224
225 <*>.            {
226                         yylval.line = line_no;
227                         return yytext[0];
228                 }
229
230 <*>[\n\r]       ;  /*ignore*/