*** empty log message ***
[dyninst.git] / igen / src / scanner.l
1 %{
2 /*
3  * $Log $
4  *
5  */
6 #ifndef lint
7 static char Copyright[] =
8     "@(#) Copyright (c) 1992 Jeff Hollingsworth. All rights reserved.";
9
10 static char rcsid[] = "@(#) $Header: /home/jaw/CVSROOT_20081103/CVSROOT/core/igen/src/scanner.l,v 1.3 1994/02/04 00:40:54 jcargill Exp $";
11 #endif
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16
17 #define YYSTYPE union parseStack
18 #include "y.tab.h"
19 #include "parse.h"
20 #include "util/h/stringPool.h"
21
22 int parsing;
23 int cur_line = 1;
24 char cur_file[80];
25 extern int emitHeader;
26 extern stringPool pool;
27
28 int yylook();
29 int yyback(int*,int);
30
31 #ifdef notdef
32 #ifdef FLEX_SCANNER
33 /* flex defines this as a macro (bad flex!). */
34 #undef yywrap;
35 extern int yywrap();
36 #endif
37 #endif
38
39 extern void yyerror(char *);
40
41 int curr;
42 int len;
43 int lineNo = 0;
44 #define MAX 255
45 char line[MAX];
46 extern char *serverTypeName;
47
48 #undef getc
49 int getScanChar(FILE *file)
50 {
51     char *ret;
52
53     if (curr == len) {
54         ret = fgets(line, MAX, file);
55         if (!ret) return(EOF);
56         lineNo++;
57         len = strlen(line);
58         curr = 0;
59     }
60     return(line[curr++]);
61 }
62
63 #ifdef FLEX_SCANNER
64 #undef YY_INPUT
65 #define YY_INPUT(buf,result,max_size)   \
66 {                                       \
67     int c = getScanChar(yyin);          \
68     result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
69 }
70 #endif
71
72 %}
73 DIGIT   [0-9]
74 DOLLAR  \$
75 INT     {DIGIT}+
76 FIX     {INT}"."{INT}
77 ALPHA   [A-Za-z]
78 IDENT   {ALPHA}({ALPHA}|{DIGIT}|_|".")*
79 %%
80 \$remote        { parsing = 1;  }
81 "//".*\n                { if (!parsing) REJECT; }
82 .*\n            { if (!parsing) {
83                     if (!strncmp(yytext, "$remote", strlen("$remote"))) {
84                         REJECT;
85                     } else {
86                         if (emitHeader) ECHO; 
87                     }
88                   } else {
89                     REJECT;
90                   }
91                 }
92 \$upcall        { return(tUPCALL); }
93 \$base          { return(tBASE); }
94 \$name          { return(tNAME); }
95 \$version       { return(tVERSION); }
96 \$async         { return(tASYNC); }
97 \$array         { return(tARRAY); }
98 \$server        { yylval.cp = serverTypeName;
99                   return(tIDENT);
100                 }
101 "("             { return(tLPAREN); }
102 ")"             { return(tRPAREN); }
103 "{"             { return(tLBLOCK); }
104 "}"             { return(tRBLOCK); }
105 ","             { return(tCOMMA); }
106 "[]"            { return(tARRAY); }
107 "*"             { return(tSTAR); }
108 ";"             { /* parsing = 0; */
109                   return(tSEMI); 
110                 }
111 "typedef"       { return(tTYPEDEF); }
112 "struct"        { return(tSTRUCT); }
113 {IDENT}         { /* it's a identifier */
114                           char *temp;
115                   temp = (char *) malloc(strlen(yytext) + 1);
116                   strcpy(temp, yytext);
117                   yylval.cp = pool.findAndAdd(temp);
118                   return(tIDENT);
119                 }
120 [ \n\t]         { }
121 {INT}           {
122                   yylval.i = atoi(yytext);
123                   return(tINT);
124                 }
125
126 .               { yyerror("invalid character"); }
127 %%
128
129 void doString()
130 {
131     char ch;
132
133     while (1) {
134         ch = getScanChar(yyin);
135         switch (ch) {
136             case '"':
137                 yytext[yyleng] = '\0';
138                 return;
139                 break;
140             
141             case '\n':
142                 yyerror("Unterminated string literal");
143                 return;
144                 break;
145
146             default:
147                 yytext[yyleng] = ch;
148                 break;
149         }
150         yyleng++;
151     }
152 }
153
154 void yyerror(char *message)
155 {
156     int i;
157     fprintf(stderr, "line %d, col %d:%s\n", lineNo, curr, message);
158     fprintf(stderr, line);
159     for (i=0; i < curr; i++) {
160         fprintf(stderr, " ");
161     }
162     fprintf(stderr, "^\n");
163 }