Commit | Line | Data |
---|---|---|
e068ed21 | 1 | /* awk.lx.l 4.4 90/06/25 */ |
3df0917d | 2 | |
e068ed21 | 3 | %X str chc reg comment |
3df0917d KM |
4 | |
5 | %{ | |
e068ed21 | 6 | #include <string.h> |
3df0917d KM |
7 | #include "awk.h" |
8 | #include "awk.def" | |
3df0917d KM |
9 | extern int yylval; |
10 | extern int mustfld; | |
569c4905 | 11 | extern int ldbg; |
e068ed21 KB |
12 | extern char *lexprog; |
13 | ||
14 | #undef YY_INPUT | |
15 | #define YY_INPUT(buf,result,max_size) \ | |
16 | { \ | |
17 | if ( lexprog ) \ | |
18 | { \ | |
19 | result = strlen( lexprog ); \ | |
20 | if ( result > max_size ) \ | |
21 | { \ | |
22 | result = max_size; \ | |
23 | strncpy( buf, lexprog, result ); \ | |
24 | } \ | |
25 | else \ | |
26 | strcpy( buf, lexprog ); \ | |
27 | lexprog += result; \ | |
28 | } \ | |
29 | else \ | |
30 | result = read( fileno(yyin), buf, max_size ); \ | |
31 | } | |
3df0917d KM |
32 | |
33 | int lineno = 1; | |
569c4905 | 34 | #define RETURN(x) {if (ldbg) ptoken(x); return(x); } |
e068ed21 | 35 | #define CADD cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN INITIAL;} |
3df0917d KM |
36 | #define CBUFLEN 150 |
37 | char cbuf[CBUFLEN]; | |
38 | int clen, cflag; | |
39 | %} | |
40 | ||
41 | A [a-zA-Z_] | |
42 | B [a-zA-Z0-9_] | |
43 | D [0-9] | |
44 | WS [ \t] | |
45 | ||
46 | %% | |
e068ed21 KB |
47 | static int sc_flag = 0; |
48 | ||
49 | if ( sc_flag ) { | |
50 | BEGIN INITIAL; | |
51 | sc_flag = 0; | |
3df0917d KM |
52 | RETURN('}'); |
53 | } | |
54 | ||
e068ed21 KB |
55 | ^\n lineno++; |
56 | ^{WS}*#.*\n lineno++; /* strip comment lines */ | |
57 | {WS} ; | |
58 | <INITIAL,reg>"\\"\n lineno++; | |
59 | "||" RETURN(BOR); | |
60 | BEGIN RETURN(XBEGIN); | |
61 | END RETURN(XEND); | |
62 | PROGEND RETURN(EOF); | |
63 | "&&" RETURN(AND); | |
64 | "!" RETURN(NOT); | |
65 | "!=" { yylval = NE; RETURN(RELOP); } | |
66 | "~" { yylval = MATCH; RETURN(MATCHOP); } | |
67 | "!~" { yylval = NOTMATCH; RETURN(MATCHOP); } | |
68 | "<" { yylval = LT; RETURN(RELOP); } | |
69 | "<=" { yylval = LE; RETURN(RELOP); } | |
70 | "==" { yylval = EQ; RETURN(RELOP); } | |
71 | ">=" { yylval = GE; RETURN(RELOP); } | |
72 | ">" { yylval = GT; RETURN(RELOP); } | |
73 | ">>" { yylval = APPEND; RETURN(RELOP); } | |
74 | "++" { yylval = INCR; RETURN(INCR); } | |
75 | "--" { yylval = DECR; RETURN(DECR); } | |
76 | "+=" { yylval = ADDEQ; RETURN(ASGNOP); } | |
77 | "-=" { yylval = SUBEQ; RETURN(ASGNOP); } | |
78 | "*=" { yylval = MULTEQ; RETURN(ASGNOP); } | |
79 | "/=" { yylval = DIVEQ; RETURN(ASGNOP); } | |
80 | "%=" { yylval = MODEQ; RETURN(ASGNOP); } | |
81 | "=" { yylval = ASSIGN; RETURN(ASGNOP); } | |
82 | ||
83 | "$"{D}+ { if (atoi(yytext+1)==0) { | |
3df0917d KM |
84 | yylval = (hack)lookup("$record", symtab, 0); |
85 | RETURN(STRING); | |
86 | } else { | |
87 | yylval = fieldadr(atoi(yytext+1)); | |
88 | RETURN(FIELD); | |
89 | } | |
90 | } | |
e068ed21 KB |
91 | "$"{WS}* { RETURN(INDIRECT); } |
92 | NF { mustfld=1; yylval = (hack)setsymtab(yytext, EMPTY, 0.0, NUM, symtab); RETURN(VAR); } | |
93 | ({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)? { | |
c48090b0 | 94 | yylval = (hack)setsymtab(yytext, EMPTY, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); } |
e068ed21 KB |
95 | "}"{WS}*\n { sc_flag = 1; lineno++; RETURN(';'); } |
96 | "}" { sc_flag = 1; RETURN(';'); } | |
97 | ;\n { lineno++; RETURN(';'); } | |
98 | \n { lineno++; RETURN(NL); } | |
99 | while RETURN(WHILE); | |
100 | for RETURN(FOR); | |
101 | if RETURN(IF); | |
102 | else RETURN(ELSE); | |
103 | next RETURN(NEXT); | |
104 | exit RETURN(EXIT); | |
105 | break RETURN(BREAK); | |
106 | continue RETURN(CONTINUE); | |
107 | print { yylval = PRINT; RETURN(PRINT); } | |
108 | printf { yylval = PRINTF; RETURN(PRINTF); } | |
109 | sprintf { yylval = SPRINTF; RETURN(SPRINTF); } | |
110 | split { yylval = SPLIT; RETURN(SPLIT); } | |
111 | substr RETURN(SUBSTR); | |
112 | index RETURN(INDEX); | |
113 | in RETURN(IN); | |
114 | getline RETURN(GETLINE); | |
115 | length { yylval = FLENGTH; RETURN(FNCN); } | |
116 | log { yylval = FLOG; RETURN(FNCN); } | |
117 | int { yylval = FINT; RETURN(FNCN); } | |
118 | exp { yylval = FEXP; RETURN(FNCN); } | |
119 | sqrt { yylval = FSQRT; RETURN(FNCN); } | |
120 | {A}{B}* { yylval = (hack)setsymtab(yytext, tostring(""), 0.0, STR|NUM, symtab); RETURN(VAR); } | |
121 | \" { BEGIN str; clen=0; } | |
122 | ||
123 | # { BEGIN comment; } | |
124 | <comment>\n { BEGIN INITIAL; lineno++; RETURN(NL); } | |
3df0917d KM |
125 | <comment>. ; |
126 | ||
e068ed21 | 127 | . { yylval = yytext[0]; RETURN(yytext[0]); } |
3df0917d KM |
128 | |
129 | <reg>"[" { BEGIN chc; clen=0; cflag=0; } | |
130 | <reg>"[^" { BEGIN chc; clen=0; cflag=1; } | |
131 | ||
132 | <reg>"?" RETURN(QUEST); | |
133 | <reg>"+" RETURN(PLUS); | |
134 | <reg>"*" RETURN(STAR); | |
135 | <reg>"|" RETURN(OR); | |
136 | <reg>"." RETURN(DOT); | |
137 | <reg>"(" RETURN('('); | |
138 | <reg>")" RETURN(')'); | |
139 | <reg>"^" RETURN('^'); | |
140 | <reg>"$" RETURN('$'); | |
141 | <reg>\\{D}{D}{D} { sscanf(yytext+1, "%o", &yylval); RETURN(CHAR); } | |
142 | <reg>\\. { if (yytext[1]=='n') yylval = '\n'; | |
143 | else if (yytext[1] == 't') yylval = '\t'; | |
144 | else yylval = yytext[1]; | |
145 | RETURN(CHAR); | |
146 | } | |
e068ed21 KB |
147 | <reg>"/" { BEGIN INITIAL; unput('/'); } |
148 | <reg>\n { yyerror("newline in regular expression"); lineno++; BEGIN INITIAL; } | |
3df0917d KM |
149 | <reg>. { yylval = yytext[0]; RETURN(CHAR); } |
150 | ||
e068ed21 | 151 | <str>\" { char *s; BEGIN INITIAL; cbuf[clen]=0; s = tostring(cbuf); |
3df0917d KM |
152 | cbuf[clen] = ' '; cbuf[++clen] = 0; |
153 | yylval = (hack)setsymtab(cbuf, s, 0.0, CON|STR, symtab); RETURN(STRING); } | |
e068ed21 | 154 | <str>\n { yyerror("newline in string"); lineno++; BEGIN INITIAL; } |
3df0917d KM |
155 | <str>"\\\"" { cbuf[clen++]='"'; } |
156 | <str,chc>"\\"n { cbuf[clen++]='\n'; } | |
157 | <str,chc>"\\"t { cbuf[clen++]='\t'; } | |
158 | <str,chc>"\\\\" { cbuf[clen++]='\\'; } | |
159 | <str>. { CADD; } | |
160 | ||
161 | <chc>"\\""]" { cbuf[clen++]=']'; } | |
162 | <chc>"]" { BEGIN reg; cbuf[clen]=0; yylval = (hack)tostring(cbuf); | |
163 | if (cflag==0) { RETURN(CCL); } | |
164 | else { RETURN(NCCL); } } | |
e068ed21 | 165 | <chc>\n { yyerror("newline in character class"); lineno++; BEGIN INITIAL; } |
3df0917d KM |
166 | <chc>. { CADD; } |
167 | ||
168 | %% | |
169 | ||
3df0917d KM |
170 | startreg() |
171 | { | |
172 | BEGIN reg; | |
173 | } | |
569c4905 SL |
174 | |
175 | ptoken(n) | |
176 | { | |
177 | extern struct tok { | |
178 | char *tnm; | |
179 | int yval; | |
180 | } tok[]; | |
569c4905 SL |
181 | extern int yylval; |
182 | ||
183 | printf("lex:"); | |
184 | if (n < 128) { | |
185 | printf(" %c\n",n); | |
186 | return; | |
187 | } | |
188 | if (n <= 256 || n >= LASTTOKEN) { | |
189 | printf("? %o\n",n); | |
190 | return; | |
191 | } | |
192 | printf(" %s",tok[n-257].tnm); | |
193 | switch (n) { | |
194 | ||
195 | case RELOP: | |
196 | case MATCHOP: | |
197 | case ASGNOP: | |
198 | case STRING: | |
199 | case FIELD: | |
200 | case VAR: | |
201 | case NUMBER: | |
202 | case FNCN: | |
203 | printf(" (%s)", yytext); | |
204 | break; | |
205 | ||
206 | case CHAR: | |
207 | printf(" (%o)", yylval); | |
208 | break; | |
209 | } | |
210 | putchar('\n'); | |
211 | } |