ycaa的计算器,开始写ACTION

原创 2007年09月12日 11:13:00

主函数

 

#include "memory.h"
int yyparse();

main()
...{
#if YYDEBUG
  
extern int yydebug;  
  yydebug 
= 1;
#endif

  init_memory();

  yyparse();

  clean_memory();  
}

 控制内存

 

#include "memory.h"
#include 
<stdio.h>
#include 
<stdlib.h>

#define MEMORY_MAX   65535

static int count;

static void* mem[MEMORY_MAX];

void init_memory()
...{
    count 
= 0;
}


void* get_memory(int size)
...{
    
void* s =NULL;

    
if (size < MEMORY_MAX)...{
        s 
= (void*)malloc(size);
        mem[count] 
= s;
        count
++;
        
return s;
    }

    
else...{
        printf(
"Memory Overflow");
        exit(
-1);
    }

}

void clean_memory()
...{
    
int i;
    
for(i=0; i<count; i++)...{
        free(mem[i]);
    }

    count 
= 0;
}

 

整数字

 

#ifndef INTERGER_H__
#define INTERGER_H__

#include 
"Node.h"

typedef 
struct Interger_t  CInterger;

typedef 
struct...{
    
int (*calc)(CInterger* this);
}
Interger_VMT;

struct Interger_t...{
     CNode super;
     
int value ;
}
;

extern void Interger_Init(CInterger*int);
extern int Interger_Calc(CInterger*);

#endif 
#include "Interger.h"

static const Interger_VMT vmt = ...{Interger_Calc};

void Interger_Init(CInterger* thisint val)
...{
    Node_Init((CNode
*)this);
    ((CNode
*)this)->vmt=(const Node_VMT*)&vmt;
    
this->value = val;
}


int Interger_Calc(CInterger* this)
...{
    
return this->value;
}

 

NODE,可以说是最顶上的一个类把

 

#ifndef NODE_H__
#define NODE_H__
typedef 
struct Node_t CNode;

typedef 
struct ...{
    
int (*calc)(CNode* this);
}
Node_VMT;

struct Node_t...{
    
const Node_VMT *vmt;
}
;

extern void Node_Init(CNode*);
//extern int Node_Calc(CNode*);

#define Node_Calc(this) 
    (((CNode
*)(this))->vmt->calc((CNode*)this))

#endif 

 

挑了一个,乘法的例子

 

#ifndef MULT_H__
#define MULT_H__
#include 
"Composite.h"

typedef 
struct Mult_t CMULT;

typedef 
struct...{
    
int (*calc)(CMULT*);
}
MULT_VMT;

struct Mult_t...{
    CComposite  super;    
}
;

extern void Mult_Init(CMULT* this, CNode *left, CNode *right);
extern int Mult_Calc(CMULT* this);
#endif

 

Mult.c

 

#include "Mult.h"
#include 
"Node.h"

static const MULT_VMT vmt = ...{Mult_Calc};

void Mult_Init(CMULT* this, CNode *left, CNode *right)
...{
    Composite_Init((CComposite
*)this,left,right );
    ((CNode
*)this)->vmt = (const Node_VMT*)&vmt;
}


int Mult_Calc(CMULT* this)
...{
    
int left_value ,right_value;
    left_value 
= Node_Calc(((CComposite*)this)->left);
    right_value 
= Node_Calc(((CComposite*)this)->right);

    
return left_value * right_value;

}

 

Composite.h

 

#ifndef COMPOSITE_H__
#define COMPOSITE_H__

#include 
"Node.h"

typedef 
struct Composite_t CComposite;

struct Composite_t...{
    CNode super;
    CNode 
*left;
    CNode 
*right;
}
;

extern void Composite_Init(CComposite *this, CNode *left, CNode *right);

#endif

 

Composite.c

#include "Composite.h"

void Composite_Init(CComposite *this, CNode *left, CNode *right)
...{
    Node_Init((CNode
*)this);
    
this->left = left;
    
this->right = right;
}

 

好了真正的主角登场

%{
#include "parser.h"
%}

%%

"+" {
 return PLUS;
}

"-" {
 return MINUS;
}

"/" {
 return DIV;
}

"*" {
 return MULT;
}

"(" {
 return L_PAR;
}

")" {
 return R_PAR;
}

[0-9]+ {
 yylval.value = atoi(yytext);

 return INTEGER;
}

"/n" {
 return NL;
}

. ;
%%

 

 

%...{
#include 
"Node.h"
#include 
"Mult.h"
#include 
"Minus.h"
#include 
"Plus.h"
#include 
"div.h"
#include 
"Interger.h"
#include 
"memory.h"
%}

%token PLUS
%token MINUS
%token DIV
%token MULT
%token L_PAR
%token R_PAR
%token <value> INTEGER
%token NL

%type <node> calc
%type <node> expression
%type <node> term
%type <node> factor

%union...{
    
int value;
    CNode 
*node;
}

%%

calc
    : calc expression NL 
...{ printf("%d ", Node_Calc($2)); }
    
| expression NL ...{ printf("%d ", Node_Calc($1)); }
    ;

expression
    : term 
...{$$ = $1; }
    
| expression PLUS term 
                
...{
                    CPlus
* pPlus = (CPlus*)get_memory(sizeof(CPlus));
                    CPlus_Initialize(pPlus,$
1,$3);
                    $$ 
= (CNode*)pPlus;
                }

    
| expression MINUS term 
                
...{
                    CMinus
* pMinus = (CMinus*)get_memory(sizeof(CMinus));
                    CMinus_Initialize(pMinus,$
1,$3);
                    $$ 
= (CNode*)pMinus;
                }

    ;

term
    : factor 
...{$$ = $1; }
    
| term MULT factor 
                
...{
                    CMULT
* pMult = (CMULT*)get_memory(sizeof(CMULT));
                    Mult_Init(pMult, $
1, $3);
                    $$ 
= (CNode*)pMult;         
                }

    
| term DIV factor 
                
...{
                    CDIV
* pDIV = (CDIV*)get_memory(sizeof(CDIV));
                    Div_Init(pDIV, $
1, $3);
                    $$ 
= (CNode*)pDIV;     
                }

    ;

factor
    : L_PAR expression R_PAR 
...{ $$ = $2; }
    
| INTEGER 
            
...{    
                CInterger 
*pInterger = (CInterger*)get_memory(sizeof(CInterger));
                Interger_Init(pInterger, $
1);
                $$ 
= (CNode*)pInterger; 
            }

    
| MINUS factor 
            
...{
                CMinus
* pMinus = (CMinus*)get_memory(sizeof(CMinus));
                CInterger 
*pInteger = (CInterger*)get_memory(sizeof(CInterger));
                
                Interger_Init(pInteger, 
0);
                CMinus_Initialize(pMinus, (CNode
*)pInteger, $2);
                
                $$  
= (CNode*)pMinus;
            }


%%

int yyerror(char *str)...{
    printf(
"%s ", str);
}

 

 

菜鸟学习Struts——简易计算器

这是利用Struts做的一个简易计算器
  • gwblue
  • gwblue
  • 2014-01-17 11:16:17
  • 3610

干货--Redis+Spring+Struts2实现网站计算器应用项目案例

  • 2016年04月11日 20:23
  • 12.78MB
  • 下载

简单的YCAA

%{int tempCount1 = -1;int tempCount2 = -1;int tempCount3 = -1;int tempCount4 = -1;int tempCount5 = -...
  • Last_Impression
  • Last_Impression
  • 2007-08-30 21:14:00
  • 772

通过Struts实现计算器来学习ActionFrom和Action.

在上一篇文章中已经对Struts的整体流程有一个基本了解,接下来的小例子是通过实现一个简易计算器来进一步了解Struts.    简单需求如下: 能够输入两个值,运算符.      计算...
  • jnqqls
  • jnqqls
  • 2012-10-31 22:12:50
  • 1868

Flash Actionscript3 做得计算器源代码 功能强大哦!

  • 2008年12月01日 09:21
  • 236KB
  • 下载

使用struts2技术,实现页面计算器的功能,输入两个操作数,分别点击加法、减法、乘法、除法按钮,分别计算出相应的结果并显示在结果页面中

  • 2014年05月17日 13:59
  • 3.63MB
  • 下载

Struts2编程练习之简易计算器

要求:使用Struts2框架开发一个简单的应用,该应用为一个计算器,能进行加、减、乘、除操作,并能对输入的数据进行判断,当用户输入非数字信息时,显示出错提示。 编程步骤: 一、导入需要的strut...
  • mileytimer
  • mileytimer
  • 2015-11-09 22:39:21
  • 1997

从零开始写javaweb框架笔记10-搭建轻量级JAVAWEB框架-确定目标

从此开始搭建一个轻量级的java WEB框架,在开始之前,前面需要确定一个目标,我们的目标是打造一个轻量级的MVC框架,而Controller是MVC的核心,其实我们想要的是这样的Controller...
  • wj903829182
  • wj903829182
  • 2016-01-10 13:28:53
  • 1856

java编写计算器

/*缺点:计算根号时只能计算一个数的,不能再表达式里面计算 不能一个输入符号,"-"除外 正能处理部分错误输入 ...
  • grave2015
  • grave2015
  • 2015-12-12 16:04:09
  • 294

struts1.2实现计算器示例

  • 2009年02月17日 00:27
  • 891KB
  • 下载
收藏助手
不良信息举报
您举报文章:ycaa的计算器,开始写ACTION
举报原因:
原因补充:

(最多只允许输入30个字)