source: trunk/athena/bin/cxref/cscan.l @ 13590

Revision 13590, 3.0 KB checked in by danw, 25 years ago (diff)
lots of cleanup, reorg, etc, to make this compile with fewer warnings
  • Property svn:executable set to *
Line 
1/*
2** cscan.l
3**
4** Does the major work of removing identifiers and constants
5** from the input stream, for Cxref. Its output is then extensively
6** postprocessed.
7**
8** Arnold Robbins, Information and Computer Science, Georgia Tech
9**      gatech!arnold
10** Copyright (c) 1984 by Arnold Robbins.
11** All rights reserved.
12** This program may not be sold, but may be distributed
13** provided this header is included.
14*/
15
16%{
17#include <stdlib.h>
18#include <string.h>
19
20#undef yywrap
21extern int line_no;
22extern char *fname, *basename(char *);
23
24void outchar(void);
25void outstring(void);
26void outint(void);
27void outfloat(void);
28void outtext(char type);
29void outid(void);
30%}
31
32letter          [A-Za-z_]
33digit           [0-9]
34
35%%
36int             |
37char            |
38float           |
39double          |
40struct          |
41union           |
42long            |
43short           |
44unsigned        |
45auto            |
46extern          |
47register        |
48typedef         |
49static          |
50goto            |
51return          |
52sizeof          |
53break           |
54continue        |
55if              |
56else            |
57for             |
58do              |
59while           |
60switch          |
61case            |
62default         |
63entry           |
64enum            |
65void            |
66define          |
67undef           |
68include         |
69ifdef           |
70ifndef          |
71defined         |
72endif           ;       /* ignore C and cpp keywords */
73
74"<".+">"        ;       /* forget about include-file names */
75
76"\n"            line_no++;
77
78"/*"            {       /* get rid of comments */
79                        register char c, c1;
80
81                  loop: while((c = input()) != '*' && c != 0)
82                                if(c == '\n')
83                                        line_no++;
84
85                        if(c == 0)
86                        {
87                                fprintf(stderr,
88                                "unexpected EOF in comment at line %d, file %s\n",
89                                        line_no, basename(fname));
90                                exit(1);
91                        }
92
93                        if((c1 = input()) != '/')
94                        {
95                                unput(c1);      /* could be '*' before '/' */
96                                goto loop;
97                        }
98                }
99
100{letter}({letter}|{digit})*     outid();  /* what we actually want */
101
102'[^\\']'                |
103'\\{digit}{1,3}'        |
104'\\[\\bfrnlt']'                 outchar();
105
106\"                      {       /* collect quoted strings */
107                                register char c;
108                                register int i;
109
110                                for(i = 1, c = input(); ; i++, c = input())
111                                        switch (c) {
112                                        case '"':
113                                                yytext[i] = c;
114                                                yytext[++i] = '\0';
115                                                yyleng = i - 1;
116                                                goto fini;
117                                       
118                                        case '\\':
119                                                yytext[i] = '\\';
120                                                yytext[++i] = input();
121                                                if (yytext[i] == '\n')
122                                                {
123                                                        line_no++;
124                                                        yytext[i] = 'N';
125                                                        /* make visible */
126                                                }
127                                                break;
128
129                                        case 0:
130                                                fprintf(stderr,
131                                        "unexpected EOF inside string at line %d, file %s\n",
132                                                        line_no, basename(fname));
133                                                exit(1);
134                                                break;
135
136                                        default:
137                                                yytext[i] = c;
138                                                break;
139                                        }
140
141                                fini:
142                                        outstring();
143                }
144
145[+-]?{digit}+[lL]?                      |
146[+-]?0[Xx]({digit}|[a-fA-F])+[lL]?              outint();
147
148[+-]?{digit}*"."{digit}+([Ee][+-]?{digit}+)?    |
149[+-]?{digit}+"."{digit}*([Ee][+-]?{digit}+)?    |
150[+-]?{digit}+[Ee][+-]?{digit}+                          outfloat();
151
152.                       ;       /* delete everything else */
153
154%%
155
156int yywrap(void)        /* wrap up for lex, return 1 */
157{
158        return(1);
159}
160
161#include "constdefs.h"
162
163extern char *fname;
164
165void outchar(void)
166{
167        outtext(CHAR);
168}
169
170void outstring(void)
171{
172        outtext(STRING);
173}
174
175void outint(void)
176{
177        int i = strlen(yytext);
178
179        /* handle long integer constants */
180
181        if (yytext[i-1] == 'l' || yytext[i-1] == 'L')
182                yytext[i-1] = '\0';
183
184        outtext(INT);
185}
186
187void outfloat(void)
188{
189        outtext(FLOAT);
190}
191
192void outtext(char type)
193{
194        printf("~%c%s\t%s\t%d\n", type, yytext, basename(fname), line_no);
195}
Note: See TracBrowser for help on using the repository browser.