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