当前位置:首页 » 编程软件 » 编译原理课程设计计算器

编译原理课程设计计算器

发布时间: 2022-03-08 10:17:19

A. c语言课程设计一个简单计算器

//名字记不太清了,这个叫递归下降算法,但这个算法肯定是首先在编译原理中的,主要用在
//各种编译器中。就是现扫描整个表达式字符串,把其中的运算符找出来,判断它们的优先级
//然后按从左到右的顺序先计算把优先级低的运算符和它两边的数据压入,这样循环做过以后
//再从头取出一个一个计算,表达式的结构类似与二叉树,遍历二叉树后把结果存在连表中供
//计算。

B. 用C语言设计一个简单计算器的课程设计(希望能尽可能的详细,多一些)

//名字记不太清了,这个叫递归下降算法,但这个算法肯定是首先在编译原理中的,主要用在
//各种编译器中。就是现扫描整个表达式字符串,把其中的运算符找出来,判断它们的优先级
//然后按从左到右的顺序先计算把优先级低的运算符和它两边的数据压入,这样循环做过以后
//再从头取出一个一个计算,表达式的结构类似与二叉树,遍历二叉树后把结果存在连表中供
//计算。你这个程序问题好像比较多啊。用的数据结构类型和函数名根本就不配套
#include <stdio.h>
struct s_node //节点结构体
{
int data;

struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link operator=NULL;
link operand=NULL;

link push(link stack,int value) //向链表添加数据
{
link newnode;

newnode=(link) malloc(sizeof(s_list));
if(!newnode)
{
printf("\nMemory allocation failure!!!");
return NULL;
}
newnode->data=value;
newnode->next=stack;
stack=newnode;
return stack;
}

link pop(link stack,int *value) //从链表取出数据
{
link top;
if(stack !=NULL)
{
top=stack;
stack=stack->next;
*value=top->data;
free(top);
return stack;
}
else
*value=-1;
}

int empty(link stack) //判断链表是否为空
{
if(stack==NULL)
return 1;
else
return 0;

}

int is_operator(char operator) //判断是否是运算符号
{
switch (operator)
{
case '+': case '-': case '*': case '/': return 1;
default:return 0;
}
}

int priority(char operator) //判断运算符优先级
{
switch(operator)
{
case '+': case '-' : return 1;
case '*': case '/' : return 2;
default: return 0;
}
}

int two_result(int operator,int operand1,int operand2) //计算数值,计算器的核心
{
switch(operator)
{
case '+':return(operand2+operand1);
case '-':return(operand2-operand1);
case '*':return(operand2*operand1);
case '/':return(operand2/operand1);
}
}

void main()
{
char expression[50];
int position=0;
int op=0;
int operand1=0;
int operand2=0;
int evaluate=0;

printf("\nPlease input the inorder expression:");
gets(expression);

while(expression[position]!='\0'&&expression[position]!='\n')
{
if(is_operator(expression[position]))
{
if(!empty(operator))
while(priority(expression[position])<= priority(operator->data)&&
!empty(operator))
{
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);
operator=pop(operator,&op);
operand=push(operand,two_result(op,operand1,operand2));
}
operator=push(operator,expression[position]);
}
else
operand=push(operand,expression[position]-48);
position++;
}
while(!empty(operator))
{
operator=pop(operator,&op);
operand=pop(operand,&operand1);
operand=pop(operand,&operand2);

operand=push(operand,two_result(op,operand1,operand2));
}
operand=pop(operand,&evaluate);
printf("The expression [%s] result is '%d' ",expression,evaluate);
getch();
}

C. (高分)求一个正确lex和yacc编的计算器(编译原理)

网上多的是,大多可以运行。关键是你要在Linux下分别将 lex和yacc文件用 flex 和 bison 编译成对应的c文件,然后在windows下用VC或者Codeblock的IDE下编写界面,连接刚才对应的c文件,生成exe交给老师。

D. 编译原理课程设计-词法分析器设计(C语言)

#include"stdio.h"/*定义I/O库所用的某些宏和变量*/

#include"string.h"/*定义字符串库函数*/

#include"conio.h"/*提供有关屏幕窗口操作函数*/

#include"ctype.h"/*分类函数*/

charprog[80]={''},

token[8];/*存放构成单词符号的字符串*/

charch;

intsyn,/*存放单词字符的种别码*/

n,

sum,/*存放整数型单词*/

m,p;/*p是缓冲区prog的指针,m是token的指针*/

char*rwtab[6]={"begin","if","then","while","do","end"};

voidscaner(){

m=0;

sum=0;

for(n=0;n<8;n++)

token[n]='';

ch=prog[p++];

while(ch=='')

ch=prog[p++];

if(isalpha(ch))/*ch为字母字符*/{

while(isalpha(ch)||isdigit(ch))/*ch为字母字符或者数字字符*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='';

ch=prog[p--];

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)/*字符串的比较*/{

syn=n+1;

break;}}

else

if(isdigit(ch))/*ch是数字字符*/{

while(isdigit(ch))/*ch是数字字符*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

case'<':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='>'){

syn=21;

token[m++]=ch;}

elseif(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

case'>':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf(" Thesignificanceofthefigures: "

"1.figures1to6saidKeyword "

"2. "

"3.figures13to28saidOperators ");

p=0;

printf(" pleaseinputstring: ");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case11:printf("(%d,%d) ",syn,sum);break;

case-1:printf(" ERROR; ");break;

default:printf("(%d,%s) ",syn,token);

}

}while(syn!=0);

getch();

}

程序测试结果

对源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下图5-1所示:

具体的你在修改修改吧

E. 用编译原理的思想写一个计算器,语言不限。有人会吗。

这既要语言表达能力强,又要懂得集成电路软件开发的技术才能完成,等着吧,好人会出现的,我也想看看别人怎么写

F. 求一个编译原理课程设计,课题名称:c—语言编译器设计(scanner和parser),要求原创,至少不能是网上的。

发给你,希望能帮助你!

G. 编译原理课程设计报告 目标代码生成器

发了请接收

H. 编译原理的课程设计,构造正规式r*(闭包运算)的NFA的程序实现。求源代码,求文档。 谢谢

个人感觉画出NFA最直观易懂了。前一个正规式仅有一个状态(开始和接受状态同),后一个虽然是三个状态,但是其中一个是绕着a闭包的状态,一个是绕着b闭包的状态,而这两个状态又是绕着第三状态(既是开始状态又是接受状态)进行闭包,所以实际上可合并为一种状态,即是说这两个正规式对应于同一个NFA,所以相等是显然成立的。

I. 跪求编译原理课程设计 要求就是:编写一款语言转换器,将类Pascal语言源程序转换为C源程序。

看看楼下怎么说。

热点内容
做解压橡皮 发布:2025-01-21 15:03:06 浏览:990
双系统win访问mac 发布:2025-01-21 14:53:52 浏览:484
安卓车机系统如何安装carplay 发布:2025-01-21 14:52:24 浏览:589
sql操作手册 发布:2025-01-21 14:46:08 浏览:311
青橙脚本 发布:2025-01-21 14:44:05 浏览:218
东风本田crv时尚版是什么配置 发布:2025-01-21 14:20:04 浏览:219
安卓如何多开软件每个机型不一样 发布:2025-01-21 14:15:29 浏览:501
iis配置php5 发布:2025-01-21 14:08:19 浏览:274
凯叔讲故事为什么联系不到服务器 发布:2025-01-21 13:56:50 浏览:387
linux镜像文件下载 发布:2025-01-21 13:34:36 浏览:218