Commit | Line | Data |
---|---|---|
9e7d5bdd TL |
1 | %Start A str chc sc reg comment |
2 | ||
3 | %{ | |
4 | #include "awk.h" | |
5 | #include "awk.def" | |
6 | #undef input /* defeat lex */ | |
7 | extern int yylval; | |
8 | extern int mustfld; | |
9 | ||
10 | int lineno = 1; | |
11 | #ifdef DEBUG | |
12 | # define RETURN(x) {if (dbg) ptoken(x); return(x); } | |
13 | #else | |
14 | # define RETURN(x) return(x) | |
15 | #endif | |
16 | #define CADD cbuf[clen++]=yytext[0]; | |
17 | char cbuf[80]; | |
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 = lookup("$record", symtab); | |
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 = setsymtab(yytext, NULL, 0.0, NUM, symtab); RETURN(VAR); } | |
74 | <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)? { | |
75 | yylval = setsymtab(yytext, NULL, 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>length { yylval = FLENGTH; RETURN(FNCN); } | |
96 | <A>log { yylval = FLOG; RETURN(FNCN); } | |
97 | <A>int { yylval = FINT; RETURN(FNCN); } | |
98 | <A>exp { yylval = FEXP; RETURN(FNCN); } | |
99 | <A>sqrt { yylval = FSQRT; RETURN(FNCN); } | |
100 | <A>{A}{B}* { yylval = setsymtab(yytext, tostring(""), 0.0, STR, symtab); RETURN(VAR); } | |
101 | <A>\" { BEGIN str; clen=0; } | |
102 | ||
103 | <A># { BEGIN comment; } | |
104 | <comment>\n { BEGIN A; lineno++; RETURN(NL); } | |
105 | <comment>. ; | |
106 | ||
107 | <A>. { yylval = yytext[0]; RETURN(yytext[0]); } | |
108 | ||
109 | <reg>"[" { BEGIN chc; clen=0; cflag=0; } | |
110 | <reg>"[^" { BEGIN chc; clen=0; cflag=1; } | |
111 | ||
112 | <reg>"?" RETURN(QUEST); | |
113 | <reg>"+" RETURN(PLUS); | |
114 | <reg>"*" RETURN(STAR); | |
115 | <reg>"|" RETURN(OR); | |
116 | <reg>"." RETURN(DOT); | |
117 | <reg>"(" RETURN('('); | |
118 | <reg>")" RETURN(')'); | |
119 | <reg>"^" RETURN('^'); | |
120 | <reg>"$" RETURN('$'); | |
121 | <reg>\\. { if (yytext[1]=='n') yylval = '\n'; | |
122 | else if (yytext[1] == 't') yylval = '\t'; | |
123 | else yylval = yytext[1]; | |
124 | RETURN(CHAR); | |
125 | } | |
126 | <reg>"/" { BEGIN A; unput('/'); } | |
127 | <reg>\n { yyerror("newline in regular expression"); lineno++; BEGIN A; } | |
128 | <reg>. { yylval = yytext[0]; RETURN(CHAR); } | |
129 | ||
130 | <str>\" { BEGIN A; cbuf[clen]=0; yylval = setsymtab("", tostring(cbuf), 0.0, CON|STR, symtab); RETURN(STRING); } | |
131 | <str>\n { yyerror("newline in string"); lineno++; BEGIN A; } | |
132 | <str>"\\\"" { cbuf[clen++]='"'; } | |
133 | <str,chc>"\\"n { cbuf[clen++]='\n'; } | |
134 | <str,chc>"\\"t { cbuf[clen++]='\t'; } | |
135 | <str,chc>"\\\\" { cbuf[clen++]='\\'; } | |
136 | <str>. CADD; | |
137 | ||
138 | <chc>"\\""]" { cbuf[clen++]=']'; } | |
139 | <chc>"]" { BEGIN reg; cbuf[clen]=0; yylval = tostring(cbuf); | |
140 | if (cflag==0) { RETURN(CCL); } | |
141 | else { RETURN(NCCL); } } | |
142 | <chc>\n { yyerror("newline in character class"); lineno++; BEGIN A; } | |
143 | <chc>. CADD; | |
144 | ||
145 | %% | |
146 | ||
147 | input() | |
148 | { | |
149 | register c; | |
150 | extern char *lexprog; | |
151 | ||
152 | if (yysptr > yysbuf) | |
153 | c = U(*--yysptr); | |
154 | else if (yyin == NULL) | |
155 | c = *lexprog++; | |
156 | else | |
157 | c = getc(yyin); | |
158 | if (c == '\n') | |
159 | yylineno++; | |
160 | else if (c == EOF) | |
161 | c = 0; | |
162 | return(c); | |
163 | } | |
164 | ||
165 | startreg() | |
166 | { | |
167 | BEGIN reg; | |
168 | } |