的功能扩张....

%{

#include 
<stdlib.h>
#include 
"entint.tab.h"
extern 
long yylval;
%}

D        [
0-9]
N        [
1-9]
O        [
0-7]
H        [
0-9a-fA-F]

%%
"+"            {return(ADDOP);}
"-"            {return(SUBOP);}
"*"            {return(MULOP);}
"/"            {return(DIVOP);}
"**"            {return(POWOP);}
"!"            {return(FACTOP);}
"("            {return(LP);}
")"            {return(RP);}
end            {return(END);}
{N}{D}
*        |
0{O}*        |
0(X|x){H}+    {//将字符串??成?整型数 
                yylval 
= strtol((char*)yytext,(char**)NULL0); 
                return(NUMBER);
            }
[
T]        ;
n            {return(NL);}
.            {return(yytext[
0]);}

 

 

%{
#include 
<stdio.h>
#define YYSTYPE 
long
%} 
%token NUMBER
%token NL
%token 
END
%token LP
%token RP
%
left  ADDOP SUBOP
%
left  MULOP DIVOP
%
right POWOP
%
right FACTOP
%
right UMINUS
%start s

%%

s        :list        {printf(
"bye-bye... ");}
        ;
        
list    :
/*empty*/
            {printf(
"welcome to ecalc. ");}
        |list line
            {printf(
"end expression or end... ");}
        ;
line    :expr NL
            {printf(
"%ld,0x%lx,0%lo ",$1,$1,$1);}
        |
END NL
            {
                printf(
"bye-bye... ");
                YYACCEPT;
            }
        |
error NL
        ;
expr    :expr ADDOP expr
            {$$ 
= $1 + $3;}
        |expr SUBOP expr
            {$$ 
= $1 - $3;}
        |expr MULOP expr
            {$$ 
= $1 * $3;}
        |expr DIVOP expr
            {
                
if ($3 == 0){
                    printf(
"zero divide ");
                    YYERROR;
                }
                $$ 
= $1 / $3;
            }
        |expr POWOP expr
            {
                
if ($3 < 0){
                    printf(
"POWOP divide ");
                    YYERROR;                
                }
                $$ 
= lpower($1,$3);
            }
        |expr FACTOP
            {
                
if ($1 < 0){
                printf(
"FACTOP divide ");
                    YYERROR;                    
                }
                lfact($
1);
            }
        |SUBOP expr    %prec UMINUS
            {$$ 
= -$2;}
        |LP expr RP
            {$$ 
= $2;}
        |NUMBER
            {$$ 
= $1;}
        ;
%%
int yyerror(char *str){
    printf(
"%s ", str);
}
    
long lpower(long x, long y){

    
long i ,pw;
    
if (x == 0){
        return 
0;
    }
    
else{
        pw 
= 1;
        
for (i = y;i;--i){
            pw 
*= i;
        }
        return (pw);    
    }
}

long lfact(long x){
    
long i,fc;
    
    
for (fc = 1,i = x;i;--i){
        fc 
*= i;
    }
    return (fc);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值