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);
}