當前位置:首頁 » 編程軟體 » 編譯原理課程設計計算器

編譯原理課程設計計算器

發布時間: 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源程序。

看看樓下怎麼說。

熱點內容
macpython3默認 發布:2025-01-21 11:58:26 瀏覽:261
芒果伺服器是什麼意思 發布:2025-01-21 11:57:54 瀏覽:40
微信聊天伺服器錯誤什麼意思 發布:2025-01-21 11:56:13 瀏覽:460
linuxtomcat不能訪問 發布:2025-01-21 11:47:11 瀏覽:393
刷新器需要什麼配置 發布:2025-01-21 11:09:28 瀏覽:972
jedis源碼 發布:2025-01-21 11:08:24 瀏覽:889
edm資料庫 發布:2025-01-21 11:05:54 瀏覽:370
QQ咋樣加密 發布:2025-01-21 11:05:45 瀏覽:163
紅帽伺服器的默認地址 發布:2025-01-21 11:04:15 瀏覽:981
編程中重命名 發布:2025-01-21 10:49:47 瀏覽:303