當前位置:首頁 » 編程軟體 » 編譯原理測試代碼

編譯原理測試代碼

發布時間: 2022-08-03 06:37:03

A. 跪求 編譯原理實驗 中間代碼生成(生成四元式)及目標代碼生成(匯編語言) 要求可以處理if 及while循環

利用ADC0809採用中斷式設計一個溫度測控系統,在LED數碼顯示器上顯示溫度值,並對溫度進行測試和控制

B. 編譯原理文法分析

改完了,能文法分析出來了!!
大概 跟你說下 你的錯誤吧:
出錯地點:
1.聲明的stack[50]沒有初始化;
2.stack的入棧是錯誤的,按照你的方式,如果原來有TM,再加入T->FN,則M就被擠出來了.(這里很關鍵,你對照我給你改的再看看)
3.s指針在你入棧操作以後並沒有指向棧頂,而是保持了不變,這肯定是有問題的.(傳入push函數的時候直接傳參數s就好了.)
4.if(*s==*p){***}else{}的else的右括弧管轄的范圍 有錯誤

不嫌棄的話,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎麼充實,呵呵,有這個程序的運行結果的. 謝謝 呵呵.
總之你對照我給你改的再看看吧. 我把我的測試輸出 也給保留了.你好對照點.
(PS.我用的vs2005,用的時候你改下頭申明,其他一樣)

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
//將分析串存放在二維數組中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定義一個布爾型的標記量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"語法分析成功,合法!"<<endl;
else cout<<"對不起!"<<input[h]<<"語法分析失敗,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定義各一將串逆序入棧的函數
char * spush(char *stack,char *pt)
{
int l=0;
//while循環的作用是將指針指向字元串的末尾,然後再由後向前入棧,從而實現逆序
while(*pt!='\0')
{
pt++;
l++;
}

if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由於前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函數
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定義一個棧空間
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指針*s指向棧的起始地址
*s='#'; //將「#」入棧
s++; //指針加1
*s='E'; //將「E」入棧
//下面的while循環實現字元串的詞法分析操作

int count = 0;

while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;

int x,y;
//若果棧頂數據和分析串的字元匹配,則將符號棧的棧頂數據出棧(即將棧頂指針減1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//當符號棧和分析串的字元不匹配時,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果對應的為空,則分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所對應的為'e',則將符號棧的棧頂數據出棧
else if(analyseTable[x][y][0]=='e') s--;
//其它,這時將查表所得的項逆序入符號棧
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}

C. C語言編譯原理是什麼

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。

1、預處理階段:

主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)

2、匯編階段:

插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。

3、編譯階段:

將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。

4、鏈接階段:

在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

D. 編譯原理

我剛回答的那個編譯原理應該也是你提的問吧,呵呵
其實你只需要合在一起提問就行了,你這樣不就省了分嗎?

挺敬重你不求甚解的學問精神,加油吧!

E. 編譯原理 實驗 題目是 用C語言編寫語法分析以及中間代碼生成程序

這是一個大工程,我們也正在做編譯原理,我做完了語法分析,你自己看書做吧

F. 編譯原理 語義分析 算術表達式求值代碼

java字元串算術表達式求值:importjava.util.ArrayList;importjava.util.Stack;/****@authoryhh**/publicclassCalculate{/***將字元串轉化成List*@paramstr*@return*/publicArrayListgetStringList(Stringstr){ArrayListresult=newArrayList();Stringnum="";for(inti=0;igetPostOrder(ArrayListinOrderList){ArrayListresult=newArrayList();Stackstack=newStack();for(inti=0;ipostOrder){Stackstack=newStack();for(inti=0;i

G. 急求編譯原理詞法分析器代碼 C++做的

我把自己很久以前寫的給你····

#include <iostream>
#include<iomanip>
using namespace std;
#define max 1000 //用戶輸入字元串的最大長度
struct ID
{
char name[8]; //存放標識符的字元數組
int addr; //單詞在單詞表中的地址
}indent[100]; //標識符
char A[8]; //工作數組
int K=0; //讀入的標識符個數
int I=0; //標識符讀入的字元個數
bool cz=true;//cun zai
char buf[max];
char Null[8]=" "; //used for clear work array
void main()
{
cout<<"Input your string:"<<endl;
cin>>buf;
strcpy(A,Null);
for(int i=0;i<strlen(buf);i++)
{
if(buf[i]==';')
{
for(int j=0;j<K;j++) //Is it exsited?
if(strcmp(A,indent[j].name)==0)
cz=false;
if(cz&&I!=0)
{
strcpy(indent[K].name,A);
indent[K].addr=100+K;
K++;
}
I=0;
cz=true;
strcpy(A,Null);
if(K>0)
{
cout<<"name: "<<setw(10)<<"addr:"<<endl;
for(j=0;j<K;j++)
cout<<indent[j].name<<setw(10)<<indent[j].addr<<endl;;

}
break;//In case dealing with the char behind ;Output a new table ,ignore chars behind;
}

else if(buf[i]==',')
{
if(I>0)
{
for(int j=0;j<K;j++)
if(strcmp(A,indent[j].name)==0)
cz=false;
if(cz&&I!=0)
{
strcpy(indent[K].name,A);
indent[K].addr=100+K;
K++;
}
I=0;
cz=true;
strcpy(A,Null);
}
}
else if((buf[i]<='z'&&buf[i]>='a')||(buf[i]<='Z'&&buf[i]>='A'))
{
A[I]=buf[i];
I++;
}
else if(buf[i]<='9'&&buf[i]>='0')
{
if(I==0)
{
cout<<"The "<<K+1<<" ident first char can not be num!"<<endl;
while((buf[i]!=',')&&(buf[i]!=';'))
{
i++;
}
i--;
}
else if(I>0)
{
A[I]=buf[i];
I++;
}
}
else
{
cout<<"The "<<K+1<<" ident contained illeagl char(s)!"<<endl;
while((buf[i]!=',')&&(buf[i]!=';'))
{
i++;
}
i--;
}
}
int choose;
cout<<"continue?press 0."<<endl;
cin>>choose;
if(choose==0)
main();//Data Structer should be clear,or will be wrong.
}

熱點內容
電腦伺服器的品牌型號怎麼查 發布:2024-04-28 04:33:06 瀏覽:137
文件上傳ui 發布:2024-04-28 04:07:14 瀏覽:482
我的世界pe登伺服器 發布:2024-04-28 04:05:58 瀏覽:670
如何監控資料庫 發布:2024-04-28 03:44:07 瀏覽:28
測溫一體機怎麼配置 發布:2024-04-28 03:11:56 瀏覽:591
大生活迅雷下載ftp 發布:2024-04-28 03:11:09 瀏覽:511
python如何生成隨機數 發布:2024-04-28 02:21:59 瀏覽:169
小雨游戲解說我的世界伺服器 發布:2024-04-28 02:08:12 瀏覽:877
安卓怎麼刪除賬戶 發布:2024-04-28 02:06:50 瀏覽:829
內存解壓縮 發布:2024-04-28 01:58:10 瀏覽:867