Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/* LEXICAL ANALYSIS FOR E */
#include
#include
#include
#include
#include
#include "ast.h"
#include "y.tab.h"
/* Maps keywords to corresponding token values. */
static struct {
char *name;
int tok;
} keywords[] = {{"var",VAR},{"if0",IF0},{"then",THEN},{"else",ELSE}};
/* Single-character operators are their own token values. */
static char operators[] = "={}()+-;";
/* VARIABLES SHARED BY LEXICAL ANALYSIS AND PARSING ------------------- */
extern YYSTYPE yylval;
/* GLOBAL VARIABLES USED BY LEXICAL ANALYSIS -------------------------- */
static FILE *fp;
static int yylineno = 1;
#define MAXCHAR 64 /* maximum length of a lexeme */
static char yytext[MAXCHAR+1];
/* ERROR REPORTING (ALSO USED BY PARSER) ------------------------------ */
void yyerror(char *msg, ...) {
va_list args;
va_start(args,msg);
fprintf(stderr, "Line %d near '%s':", yylineno,yytext);
vfprintf(stderr, msg,args);
fprintf(stderr,"\n");
va_end(args);
exit(1);
}
/* LEXICAL ANALYSIS --------------------------------------------------- */
/* Store character into current lexeme, checking for overflow.*/
static void store(char x,int i)
{
if (i < MAXCHAR)
yytext[i] = x;
else {
yytext[MAXCHAR] = '\0';
yyerror("Lexical error: Symbol or number too long: \"%s\"",yytext);
}
}
int yylex() {
yytext[0] = '\0';
while (1) {
int c = getc(fp);
if (c == EOF) {
return 0;
} else if ( c == '\n') {
yylineno++;
continue;
} else if (isspace(c))
continue;
else if (strchr(operators,c) != NULL) {
store(c,0);
yytext[1] = '\0';
return c;
} else if (isalpha(c)) {
int i = 0;
store(c,i++);
c = getc(fp);
while (isalnum(c)) {
store(c,i++);
c = getc(fp);
}
yytext[i] = '\0';
ungetc(c,fp);
for (i = 0; i < (sizeof(keywords)/sizeof(keywords[0])); i++)
if (!strcmp(yytext,keywords[i].name)) {
return keywords[i].tok;
}
yylval.svalue = strsave(yytext);
return ID;
} else if (isdigit(c)) {
int i = 0;
store(c,i++);
c = getc(fp);
while (isdigit(c)) {
store(c,i++);
c = getc(fp);
};
yytext[i] = '\0';
ungetc(c,fp);
yylval.ivalue = atoi(yytext); /* don't worry about conversion errors */
return NUM;
} else
yyerror("Lexical error: Invalid character: \"%c\"", c);
}
}
void init_lex(FILE *fp0) {
fp = fp0;
yylineno = 1;
}