|
|
1.1 root 1: /* awk.lx.l 4.3 84/12/08 */
2:
3: %Start A str chc sc reg comment
4:
5: %{
6: #include "awk.h"
7: #include "awk.def"
8: #undef input /* defeat lex */
9: extern int yylval;
10: extern int mustfld;
11: extern int ldbg;
12:
13: int lineno = 1;
14: #define RETURN(x) {if (ldbg) ptoken(x); return(x); }
15: #define CADD cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN A;}
16: #define CBUFLEN 150
17: char cbuf[CBUFLEN];
18: int clen, cflag;
19: %}
20:
21: A [a-zA-Z_]
22: B [a-zA-Z0-9_]
23: D [0-9]
24: WS [ \t]
25:
26: %%
27: switch (yybgin-yysvec-1) { /* witchcraft */
28: case 0:
29: BEGIN A;
30: break;
31: case sc:
32: BEGIN A;
33: RETURN('}');
34: }
35:
36: <A>^\n lineno++;
37: <A>^{WS}*#.*\n lineno++; /* strip comment lines */
38: <A>{WS} ;
39: <A,reg>"\\"\n lineno++;
40: <A>"||" RETURN(BOR);
41: <A>BEGIN RETURN(XBEGIN);
42: <A>END RETURN(XEND);
43: <A>PROGEND RETURN(EOF);
44: <A>"&&" RETURN(AND);
45: <A>"!" RETURN(NOT);
46: <A>"!=" { yylval = NE; RETURN(RELOP); }
47: <A>"~" { yylval = MATCH; RETURN(MATCHOP); }
48: <A>"!~" { yylval = NOTMATCH; RETURN(MATCHOP); }
49: <A>"<" { yylval = LT; RETURN(RELOP); }
50: <A>"<=" { yylval = LE; RETURN(RELOP); }
51: <A>"==" { yylval = EQ; RETURN(RELOP); }
52: <A>">=" { yylval = GE; RETURN(RELOP); }
53: <A>">" { yylval = GT; RETURN(RELOP); }
54: <A>">>" { yylval = APPEND; RETURN(RELOP); }
55: <A>"++" { yylval = INCR; RETURN(INCR); }
56: <A>"--" { yylval = DECR; RETURN(DECR); }
57: <A>"+=" { yylval = ADDEQ; RETURN(ASGNOP); }
58: <A>"-=" { yylval = SUBEQ; RETURN(ASGNOP); }
59: <A>"*=" { yylval = MULTEQ; RETURN(ASGNOP); }
60: <A>"/=" { yylval = DIVEQ; RETURN(ASGNOP); }
61: <A>"%=" { yylval = MODEQ; RETURN(ASGNOP); }
62: <A>"=" { yylval = ASSIGN; RETURN(ASGNOP); }
63:
64: <A>"$"{D}+ { if (atoi(yytext+1)==0) {
65: yylval = (hack)lookup("$record", symtab, 0);
66: RETURN(STRING);
67: } else {
68: yylval = fieldadr(atoi(yytext+1));
69: RETURN(FIELD);
70: }
71: }
72: <A>"$"{WS}* { RETURN(INDIRECT); }
73: <A>NF { mustfld=1; yylval = (hack)setsymtab(yytext, EMPTY, 0.0, NUM, symtab); RETURN(VAR); }
74: <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)? {
75: yylval = (hack)setsymtab(yytext, EMPTY, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); }
76: <A>"}"{WS}*\n { BEGIN sc; lineno++; RETURN(';'); }
77: <A>"}" { BEGIN sc; RETURN(';'); }
78: <A>;\n { lineno++; RETURN(';'); }
79: <A>\n { lineno++; RETURN(NL); }
80: <A>while RETURN(WHILE);
81: <A>for RETURN(FOR);
82: <A>if RETURN(IF);
83: <A>else RETURN(ELSE);
84: <A>next RETURN(NEXT);
85: <A>exit RETURN(EXIT);
86: <A>break RETURN(BREAK);
87: <A>continue RETURN(CONTINUE);
88: <A>print { yylval = PRINT; RETURN(PRINT); }
89: <A>printf { yylval = PRINTF; RETURN(PRINTF); }
90: <A>sprintf { yylval = SPRINTF; RETURN(SPRINTF); }
91: <A>split { yylval = SPLIT; RETURN(SPLIT); }
92: <A>substr RETURN(SUBSTR);
93: <A>index RETURN(INDEX);
94: <A>in RETURN(IN);
95: <A>getline RETURN(GETLINE);
96: <A>length { yylval = FLENGTH; RETURN(FNCN); }
97: <A>log { yylval = FLOG; RETURN(FNCN); }
98: <A>int { yylval = FINT; RETURN(FNCN); }
99: <A>exp { yylval = FEXP; RETURN(FNCN); }
100: <A>sqrt { yylval = FSQRT; RETURN(FNCN); }
101: <A>{A}{B}* { yylval = (hack)setsymtab(yytext, tostring(""), 0.0, STR|NUM, symtab); RETURN(VAR); }
102: <A>\" { BEGIN str; clen=0; }
103:
104: <A># { BEGIN comment; }
105: <comment>\n { BEGIN A; lineno++; RETURN(NL); }
106: <comment>. ;
107:
108: <A>. { yylval = yytext[0]; RETURN(yytext[0]); }
109:
110: <reg>"[" { BEGIN chc; clen=0; cflag=0; }
111: <reg>"[^" { BEGIN chc; clen=0; cflag=1; }
112:
113: <reg>"?" RETURN(QUEST);
114: <reg>"+" RETURN(PLUS);
115: <reg>"*" RETURN(STAR);
116: <reg>"|" RETURN(OR);
117: <reg>"." RETURN(DOT);
118: <reg>"(" RETURN('(');
119: <reg>")" RETURN(')');
120: <reg>"^" RETURN('^');
121: <reg>"$" RETURN('$');
122: <reg>\\{D}{D}{D} { sscanf(yytext+1, "%o", &yylval); RETURN(CHAR); }
123: <reg>\\. { if (yytext[1]=='n') yylval = '\n';
124: else if (yytext[1] == 't') yylval = '\t';
125: else yylval = yytext[1];
126: RETURN(CHAR);
127: }
128: <reg>"/" { BEGIN A; unput('/'); }
129: <reg>\n { yyerror("newline in regular expression"); lineno++; BEGIN A; }
130: <reg>. { yylval = yytext[0]; RETURN(CHAR); }
131:
132: <str>\" { char *s; BEGIN A; cbuf[clen]=0; s = tostring(cbuf);
133: cbuf[clen] = ' '; cbuf[++clen] = 0;
134: yylval = (hack)setsymtab(cbuf, s, 0.0, CON|STR, symtab); RETURN(STRING); }
135: <str>\n { yyerror("newline in string"); lineno++; BEGIN A; }
136: <str>"\\\"" { cbuf[clen++]='"'; }
137: <str,chc>"\\"n { cbuf[clen++]='\n'; }
138: <str,chc>"\\"t { cbuf[clen++]='\t'; }
139: <str,chc>"\\\\" { cbuf[clen++]='\\'; }
140: <str>. { CADD; }
141:
142: <chc>"\\""]" { cbuf[clen++]=']'; }
143: <chc>"]" { BEGIN reg; cbuf[clen]=0; yylval = (hack)tostring(cbuf);
144: if (cflag==0) { RETURN(CCL); }
145: else { RETURN(NCCL); } }
146: <chc>\n { yyerror("newline in character class"); lineno++; BEGIN A; }
147: <chc>. { CADD; }
148:
149: %%
150:
151: input()
152: {
153: register c;
154: extern char *lexprog;
155:
156: if (yysptr > yysbuf)
157: c = U(*--yysptr);
158: else if (yyin == NULL)
159: c = *lexprog++;
160: else
161: c = getc(yyin);
162: if (c == '\n')
163: yylineno++;
164: else if (c == EOF)
165: c = 0;
166: return(c);
167: }
168:
169: startreg()
170: {
171: BEGIN reg;
172: }
173:
174: ptoken(n)
175: {
176: extern struct tok {
177: char *tnm;
178: int yval;
179: } tok[];
180: extern char yytext[];
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.