int yylex(void) { int ch, c2, t; while ((ch = *yyinp++) == ' ' || ch == '\t') ; t = ISDIGIT(ch) ? NUMBER : ch; if (ch < 128 && (spechr[ch] & C_2)) c2 = *yyinp++; else c2 = 0; switch (t) { case 0: return WARN; case '=': if (c2 == '=') return EQ; break; case '!': if (c2 == '=') return NE; break; case '|': if (c2 == '|') return OROR; break; case '&': if (c2 == '&') return ANDAND; break; case '<': if (c2 == '<') return LS; if (c2 == '=') return LE; break; case '>': if (c2 == '>') return RS; if (c2 == '=') return GE; break; case '+': case '-': if (ch == c2) error("invalid preprocessor operator %c%c", ch, c2); break; case '\'': yynode.op = NUMBER; yynode.nd_val = charcon(&yyinp); return NUMBER; case NUMBER: cvtdig(&yyinp); return NUMBER; default: if (ISID0(t)) { yyinp--; while (ISID(*yyinp)) yyinp++; yynode.nd_val = 0; return NUMBER; } return ch; } yyinp--; return ch; }
int yylex(void) { static int ifdef, noex; struct symtab *nl; int ch, c2; while ((ch = sloscan()) == WSPACE) ; if (ch < 128 && (spechr[ch] & C_2)) c2 = inch(); else c2 = 0; switch (ch) { case '=': if (c2 == '=') return EQ; break; case '!': if (c2 == '=') return NE; break; case '|': if (c2 == '|') return OROR; break; case '&': if (c2 == '&') return ANDAND; break; case '<': if (c2 == '<') return LS; if (c2 == '=') return LE; break; case '>': if (c2 == '>') return RS; if (c2 == '=') return GE; break; case '+': case '-': if (ch == c2) error("invalid preprocessor operator %c%c", ch, c2); break; case '/': if (Cflag == 0 || c2 != '*') break; /* Found comment that need to be skipped */ for (;;) { ch = inch(); c1: if (ch != '*') continue; if ((ch = inch()) == '/') break; goto c1; } return yylex(); case NUMBER: if (yytext[0] == '\'') { yylval.node.op = NUMBER; yylval.node.nd_val = charcon(yytext); } else cvtdig(yytext[0] != '0' ? 10 : yytext[1] == 'x' || yytext[1] == 'X' ? 16 : 8); return NUMBER; case IDENT: if (strcmp((char *)yytext, "defined") == 0) { ifdef = 1; return DEFINED; } nl = lookup(yytext, FIND); if (ifdef) { yylval.node.nd_val = nl != NULL; ifdef = 0; } else if (nl && noex == 0) { usch *och = stringbuf; int i; i = kfind(nl); unch(WARN); if (i) unpstr(stringbuf); else unpstr(nl->namep); stringbuf = och; noex = 1; return yylex(); } else { yylval.node.nd_val = 0; } yylval.node.op = NUMBER; return NUMBER; case WARN: noex = 0; /* FALLTHROUGH */ case PHOLD: return yylex(); default: return ch; } unch(c2); return ch; }
int yylex() { static int ifdef, noex; struct symtab *nl; int ch, c2; while ((ch = sloscan()) == WSPACE) ; if (ch < 128 && spechr[ch] & C_2) c2 = inpch(); else c2 = 0; #define C2(a,b,c) case a: if (c2 == b) return c; break switch (ch) { C2('=', '=', EQ); C2('!', '=', NE); C2('|', '|', OROR); C2('&', '&', ANDAND); case '<': if (c2 == '<') return LS; if (c2 == '=') return LE; break; case '>': if (c2 == '>') return RS; if (c2 == '=') return GE; break; case '+': case '-': if (ch == c2) badop(""); break; case '/': if (Cflag == 0 || c2 != '*') break; /* Found comment that need to be skipped */ for (;;) { ch = inpch(); c1: if (ch != '*') continue; if ((ch = inpch()) == '/') break; goto c1; } return yylex(); case NUMBER: if (yytext[0] == '\'') { yylval.node.op = NUMBER; yylval.node.nd_val = charcon((usch *)yytext); } else cvtdig(yytext[0] != '0' ? 10 : yytext[1] == 'x' || yytext[1] == 'X' ? 16 : 8); return NUMBER; case IDENT: if (strcmp(yytext, "defined") == 0) { ifdef = 1; return DEFINED; } nl = lookup((usch *)yytext, FIND); if (ifdef) { yylval.node.nd_val = nl != NULL; ifdef = 0; } else if (nl && noex == 0) { usch *c, *och = stringbuf; c = gotident(nl); unch(1); unpstr(c); stringbuf = och; noex = 1; return yylex(); } else { yylval.node.nd_val = 0; } yylval.node.op = NUMBER; return NUMBER; case 1: /* WARN */ noex = 0; return yylex(); default: return ch; } unch(c2); return ch; }