2.11BSD/src/local/cxref/cscan.l
/*
** cscan.l
**
** Does the major work of removing identifiers and constants
** from the input stream, for Cxref. Its output is then extensively
** postprocessed.
**
** Arnold Robbins, Information and Computer Science, Georgia Tech
** gatech!arnold
** Copyright (c) 1984 by Arnold Robbins.
** All rights reserved.
** This program may not be sold, but may be distributed
** provided this header is included.
*/
%{
extern int line_no;
extern char *fname, *basename();
%}
letter [A-Za-z_]
digit [0-9]
%%
int |
char |
float |
double |
struct |
union |
long |
short |
unsigned |
auto |
extern |
register |
typedef |
static |
goto |
return |
sizeof |
break |
continue |
if |
else |
for |
do |
while |
switch |
case |
default |
entry |
enum |
void |
define |
undef |
include |
ifdef |
ifndef |
defined |
endif ; /* ignore C and cpp keywords */
"<".+">" ; /* forget about include-file names */
"\n" line_no++;
"/*" { /* get rid of comments */
register char c, c1;
loop: while((c = input()) != '*' && c != 0)
if(c == '\n')
line_no++;
if(c == 0)
{
fprintf(stderr,
"unexpected EOF in comment at line %d, file %s\n",
line_no, basename(fname));
exit(1);
}
if((c1 = input()) != '/')
{
unput(c1); /* could be '*' before '/' */
goto loop;
}
}
{letter}({letter}|{digit})* outid(); /* what we actually want */
'[^\\']' |
'\\{digit}{1,3}' |
'\\[\\bfrnlt']' outchar();
\" { /* collect quoted strings */
register char c;
register int i;
for(i = 1, c = input(); ; i++, c = input())
switch (c) {
case '"':
yytext[i] = c;
yytext[++i] = '\0';
yyleng = i - 1;
goto fini;
case '\\':
yytext[i] = '\\';
yytext[++i] = input();
if (yytext[i] == '\n')
{
line_no++;
yytext[i] = 'N';
/* make visible */
}
break;
case 0:
fprintf(stderr,
"unexpected EOF inside string at line %d, file %s\n",
line_no, basename(fname));
exit(1);
break;
default:
yytext[i] = c;
break;
}
fini:
outstring();
}
[+-]?{digit}+[lL]? |
[+-]?0[Xx]({digit}|[a-fA-F])+[lL]? outint();
[+-]?{digit}*"."{digit}+([Ee][+-]?{digit}+)? |
[+-]?{digit}+"."{digit}*([Ee][+-]?{digit}+)? |
[+-]?{digit}+[Ee][+-]?{digit}+ outfloat();
. ; /* delete everything else */
%%
yywrap() /* wrap up for lex, return 1 */
{
return(1);
}
#include "constdefs.h"
extern char *fname;
extern char *basename();
outchar()
{
outtext(CHAR);
}
outstring()
{
outtext(STRING);
}
outint()
{
int i = strlen(yytext);
/* handle long integer constants */
if (yytext[i-1] == 'l' || yytext[i-1] == 'L')
yytext[i-1] = '\0';
outtext(INT);
}
outfloat()
{
outtext(FLOAT);
}
outtext(type)
char type;
{
printf("~%c%s\t%s\t%d\n", type, yytext, basename(fname), line_no);
}