www.pudn.com > FUN_2V.rar > calc_flex.l
%{
#ifndef YY_NO_UNISTD_H
#define YY_NO_UNISTD_H
#endif/*YY_NO_UNISTD_H*/
#include "ucvm_type.h"
#include "calc_yacc.h"
void skip_comment(void);
void skip_spaceSS(void);
void save_tokenID(const char *);
void save_tokenCS(const char *);
void save_tokenCC(const char *);
void save_tokenCI(const char *);
void save_tokenCH(const char *);
void save_tokenCF(const char *);
void save_tokenOP(const char *);
void save_tokenAS(short);
long my_strTOint(const char *);
long my_hexTOint(const char *);
Real my_strTOdbl(const char *);
%}
%%
"/*" { skip_comment(); }
"if" { save_tokenOP(yytext); return(IF); }
"else" { save_tokenOP(yytext); return(ELSE); }
"goto" { save_tokenOP(yytext); return(GOTO); }
"do" { save_tokenOP(yytext); return(DO); }
"for" { save_tokenOP(yytext); return(FOR); }
"while" { save_tokenOP(yytext); return(WHILE); }
"break" { save_tokenOP(yytext); return(BREAK); }
"continue" { save_tokenOP(yytext); return(CONTI); }
[a-zA-Z_][a-zA-Z_0-9]* { save_tokenID(yytext); return(IDENTIFIER); }
\"(\\.|[^\\"])*\" { save_tokenCS(yytext); return(CONSTANT_S); }
'(\\.|[^\\'])+' { save_tokenCC(yytext); return(CONSTANT_C); }
0[xX][a-fA-F0-9]+ { save_tokenCH(yytext); return(CONSTANT_I); }
[0-9]+ { save_tokenCI(yytext); return(CONSTANT_I); }
[0-9]+[Ee][+-]?[0-9]+ { save_tokenCF(yytext); return(CONSTANT_R); }
[0-9]*"."[0-9]+([Ee][+-]?[0-9]+)? { save_tokenCF(yytext); return(CONSTANT_R); }
[0-9]+"."[0-9]*([Ee][+-]?[0-9]+)? { save_tokenCF(yytext); return(CONSTANT_R); }
"+=" { save_tokenAS(ASSADD); return(ASS); }
"-=" { save_tokenAS(ASSSUB); return(ASS); }
"*=" { save_tokenAS(ASSMUL); return(ASS); }
"/=" { save_tokenAS(ASSDIV); return(ASS); }
"%=" { save_tokenAS(ASSBAL); return(ASS); }
"&=" { save_tokenAS(ASSAND); return(ASS); }
"^=" { save_tokenAS(ASSXOR); return(ASS); }
"|=" { save_tokenAS(ASSOOR); return(ASS); }
"<<=" { save_tokenAS(ASSSHL); return(ASS); }
">>=" { save_tokenAS(ASSSHR); return(ASS); }
"&&" { save_tokenOP(yytext); return(AND); }
"||" { save_tokenOP(yytext); return(OOR); }
"==" { save_tokenOP(yytext); return(CEQ); }
"!=" { save_tokenOP(yytext); return(CNE); }
">=" { save_tokenOP(yytext); return(CGE); }
"<=" { save_tokenOP(yytext); return(CLE); }
"<<" { save_tokenOP(yytext); return(SHL); }
">>" { save_tokenOP(yytext); return(SHR); }
"++" { save_tokenOP(yytext); return(INC); }
"--" { save_tokenOP(yytext); return(DEC); }
"+" { save_tokenOP(yytext); return('+'); }
"-" { save_tokenOP(yytext); return('-'); }
"*" { save_tokenOP(yytext); return('*'); }
"/" { save_tokenOP(yytext); return('/'); }
"%" { save_tokenOP(yytext); return('%'); }
"&" { save_tokenOP(yytext); return('&'); }
"^" { save_tokenOP(yytext); return('^'); }
"|" { save_tokenOP(yytext); return('|'); }
"!" { save_tokenOP(yytext); return('!'); }
"~" { save_tokenOP(yytext); return('~'); }
"(" { save_tokenOP(yytext); return('('); }
")" { save_tokenOP(yytext); return(')'); }
"[" { save_tokenOP(yytext); return('['); }
"]" { save_tokenOP(yytext); return(']'); }
"{" { save_tokenOP(yytext); return('{'); }
"}" { save_tokenOP(yytext); return('}'); }
">" { save_tokenOP(yytext); return('>'); }
"<" { save_tokenOP(yytext); return('<'); }
"," { save_tokenOP(yytext); return(','); }
";" { save_tokenOP(yytext); return(';'); }
"." { save_tokenOP(yytext); return('.'); }
"=" { save_tokenAS(ASSIGN); return(ASS); }
":" { save_tokenOP(yytext); return(':'); }
[ \t\v\n\f] { skip_spaceSS(); }
%%
yywrap()
{
return(1);
}
#ifdef __cplusplus
void skip_comment(void)
{
char c, c1;
loop:
while ((c = yyinput()) != '*' && c != 0)
/*putchar(c)*/;
if ((c1 = yyinput()) != '/' && c != 0)
{
unput(c1);
goto loop;
}
if (c != 0)
{
/*putchar(c)*/;
}
}
#else /*__cplusplus*/
void skip_comment(void)
{
char c, c1;
loop:
while ((c = input()) != '*' && c != 0)
/*putchar(c)*/;
if ((c1 = input()) != '/' && c != 0)
{
unput(c1);
goto loop;
}
if (c != 0)
{
/*putchar(c1)*/;
}
}
#endif /*__cplusplus*/
void skip_spaceSS(void)
{
/*
fprintf(yyout, "space: [%d]\n", *yytext);
*/
}
void save_tokenID(const char *s)
{
yylval.s_value = strdup(s);
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenID:[%s]\n", yylval.s_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenCS(const char *s)
{
yylval.s_value = strdup(s);
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenCS:[%s]\n", yylval.s_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenCC(const char *s)
{
yylval.c_value = *s;
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenCC:[%c]\n", yylval.c_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenCI(const char *s)
{
yylval.i_value = my_strTOint(s);
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenCI:[%d]\n", yylval.i_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenCH(const char *s)
{
yylval.i_value = my_hexTOint(s);
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenCH:[%d]\n", yylval.i_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenCF(const char *s)
{
yylval.r_value = my_strTOdbl(s);
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenCF:[%f]\n", yylval.r_value);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenOP(const char *s)
{
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenOP:[%s]\n", s);
#endif/*DEBUG_PRINT_TOKEN*/
}
void save_tokenAS(short i)
{
yylval.i_value = i;
#ifdef DEBUG_PRINT_TOKEN
fprintf(yyout, "tokenAS:[%d]\n", i);
#endif/*DEBUG_PRINT_TOKEN*/
}
long my_strTOint(const char *s)
{
long result = 0;
while(*s)
{
result = (result << 1) + (result << 3) + (*s - '0');
s ++;
};
return(result);
}
long my_hexTOint(const char *s)
{
long result = 0;
s += 2;
while(*s)
{
if(*s <= '9')
result = (result << 4) | (*s - '0');
else
if(*s <= 'F')
result = (result << 4) | (*s - 'A');
else
result = (result << 4) | (*s - 'a');
s ++;
};
}
Real my_strTOdbl(const char *s)
{
long p = 0;
Real r = 0;
while(*s)
{
if(*s >= '0' && *s <= '9')
{
r = r * 10 +(*s - '0');
s ++ ;
}
else
break;
}
if(*s == '.')
{
s ++ ;
while(*s)
{
if(*s >= '0' && *s <= '9')
{
r = r * 10 +(*s - '0');
p -- ;
s ++ ;
}
else
break;
};
}
if(*s == 'e'
|| *s == 'E')
{
s ++ ;
if(*s == '-')
{
p += (0 - my_strTOint(++ s));
}
else
if(*s == '+')
{
p += (0 + my_strTOint(++ s));
}
else
{
p += my_strTOint(s);
}
}
return(pow(10.0, p)* r);
}