自己写的flex计算器,菜鸟一个,代码写的很烂,各位多多包涵


自己写的flex计算器,支持+,-,*,/ 和(),支持10以上的运算,但是不支持小数。


借鉴了http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 和 http://blog.csdn.net/antineutrino/article/details/6763722这个两位博主的文章。

第一次写博客,不对的地方请各位指教。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600">
    <mx:Script>
        <![CDATA[
            
        import mx.controls.Alert;
            
        var operate:String="";                                    //运算符
        var str:Array=new Array();
        var ann:Number=0;
        var arrynumber:Array=new Array();          //存放操作数的数组
        var arryoperate:Array=new Array();         //存放运算符的数组
        var num1:String;  
        var num2:String;
            private function cResult():Number      //运算函数
            {
                var result:Number=0;
                switch(operate){
                    case "/":
                        if(Number(num2)!=0)
                        {result=Number(num1)/Number(num2);}
                        else
                        {
                            Alert.show("除数不能为0!","警告",Alert.OK);
                            result=0;
                        }
                        break;
                    case "*":
                        result=Number(num1)*Number(num2);
                        break;
                    case "+":
                        result=Number(num1)+Number(num2);
                        break;
                    case "-":
                        result=Number(num1)-Number(num2);
                        break;
                    default:break;        
                }
                return result;
            }
        public function Isoperate(c:String):Boolean     //运算符判断函数
        {
            switch(c)
            {
                case "+":
                    return true;
                case "-":
                    return true;
                case "*":
                    return true;
                case "/":
                    return true;
                default:break;            
            }
            return false;
        }
        public function Precedence(op1:String,op2:String):Number    //优先级比较函数
        {
            if(op1=="(")
            {
                return -1;
            }
            if(op1=="+"||op1=="-")
            {
                if(op2=="*"||op2=="/")
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
            if(op1=="*"||op1=="/")
            {
                if(op2=="+"||op2=="-")
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            return -1;
            
        }    
        
        public function nFix2PostFix():void    //中缀运算式转化成后缀运输式
        {   
            var str:String;
            var s:String;
            var i:Number=0;  //表达式长度
            var j:Number=0;//操作符计数器
            var k:Number=0;//运算数计数器
            var length:Number;
            var operat:Number=0;//运算符监视器
            s=txt1.text
            length=txt1.length;
            for(i=0;i<length;i++)
            {
                str=s.charAt(i);
                if(str=="(")
                {
                    arryoperate[j]=str;
                    j++;
                    operat=1;
                }
                else if(str==")")
                {   
                    j=j-1;
                    while(arryoperate[j]!="(")
                    {
                        arrynumber[k]=arryoperate[j];
                        k++;
                        j--;
                    }
                    operat=1;
                }
                else
                {
                    if(!Isoperate(str))
                    {
                        if(operat==0&&k-1>=0)
                        {
                            arrynumber[k-1]=String(Number(arrynumber[k-1])*10+Number(str));
                            operat=0;
                        }
                        else{
                                arrynumber[k]=str;
                                k++;
                                operat=0;
                        }
                    
                    }
                    else
                    {
                       
                        while(arryoperate[0]!=""&&Precedence(arryoperate[j-1],str)>=0)
                        {
                            arrynumber[k]=arryoperate[j-1];
                            k++;
                            j--;
                        }
                        arryoperate[j]=str;
                        j++;
                        operat=1;
                    }
                }
            }
            j=j-1;
            while(j>=0)
            {
                arrynumber[k]=arryoperate[j];
                k++;
                j--;
            }
            arrynumber[k]=0;
            ann=k;
            var stro:String="";
            var z:Number;
                for(z=0;z<ann;z++)
                {
                    stro+=arrynumber[z];
                }
                txt2.text=stro;
            }
            private function txt3Btn_click():void       //后缀运算
            {
                var i:Number;
                var k:Number=0;
                var s:String;
                var a:Array=new Array();
                for(i=0;i<ann;i++)
                {    
                    s=arrynumber[i];
                    if(Isoperate(s)==false)
                    {  a[k]=arrynumber[i];k++; }
                    else
                    {
                        num1=a[k-2];
                        num2=a[k-1];
                        operate=arrynumber[i];
                        a[k-2]=cResult();
                        k=k-1;
                    }
                }
                txt3.text=a[0];
            }
    
        ]]>
        </mx:Script>
    <mx:Panel x="230" y="88" width="421" height="284" layout="absolute">
        <mx:TextInput x="120.5" y="19" id="txt1" />
        <mx:TextInput x="120.5" y="74" id="txt2"/>
        <mx:Button x="154" y="212" label="按钮"  click="nFix2PostFix()"/>
        <mx:Label x="28" y="76" text="num1"/>
        <mx:TextInput x="120" y="126" id="txt3"/>
        <mx:TextInput x="120" y="182" id="txt4"/>
        <mx:Label x="28" y="130" text="operate"/>
        <mx:Label x="28" y="196" text="num2"/>
        <mx:Button x="220" y="212" label="计算" click="txt3Btn_click()"/>
    </mx:Panel>
    
</mx:Application>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的整数计算器示例,使用Flex和Bison来实现解析和计算表达式。以下是代码和说明: 首先,我们需要创建一个flex文件(例如calc.l),来定义我们的语法规则和词法分析器。以下是一个简单的例子: ``` %{ #include <stdio.h> #include "calc.tab.h" // 包含Bison生成的头文件 %} %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } [\+\-\/\*\(\)] { return yytext[0]; } [ \t\n] { /* skip whitespace */ } %% int yywrap() { return 1; } ``` 这个文件定义了三个规则: - `NUMBER`:匹配整数,将其转换为C语言的整数类型,并将其存储在`yylval`中,以便Bison在解析时使用。 - `[\+\-\/\*\(\)]`:匹配运算符和括号,并返回单个字符的ASCII码。 - `[ \t\n]`:跳过空格、制表符和换行符。 接下来,我们需要创建一个Bison文件(例如calc.y),定义我们的语法分析器和计算规则。以下是一个简单的例子: ``` %{ #include <stdio.h> #include <stdlib.h> %} %token NUMBER %left '+' '-' %left '*' '/' %left UMINUS %% input: /* 空 */ { printf("> "); } | input line { printf("> "); } ; line: '\n' | exp '\n' { printf("= %d\n", $1); } ; exp: NUMBER { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec UMINUS { $$ = -$2; } | '(' exp ')' { $$ = $2; } ; %% int main() { yyparse(); return 0; } void yyerror(char *s) { fprintf(stderr, "error: %s\n", s); } ``` 这个文件定义了以下规则: - `input`:一个空输入或多个`line`,用于读取和计算多个表达式。 - `line`:一个单独的表达式,以换行符结尾。 - `exp`:一个数字、一个二元运算、一个一元运算或一个括号表达式。 在这里,我们使用了Bison的`%left`和`%prec`指令,用于定义运算符的优先级和结合性。在表达式中,我们还支持一元减法表达式(`UMINUS`)。 最后,我们需要编译并链接我们的程序。在Unix/Linux系统中,可以使用以下命令: ``` $ flex calc.l $ bison -d calc.y $ gcc -o calc calc.tab.c lex.yy.c -lfl ``` 现在,我们可以运行我们的整数计算器,并输入一些表达式进行计算: ``` $ ./calc > 1+2 = 3 > 3*4+2 = 14 > (3+4)*2 = 14 > -5+3*2 = 1 > ^D ``` 这个简单的计算器可以通过扩展Bison规则和Flex规则来支持更多的语法和运算符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值