導航:首頁 > 數據處理 > 四元式是哪個階段的輸出數據

四元式是哪個階段的輸出數據

發布時間:2022-04-16 04:43:33

⑴ 描述一般的編譯程序可分為哪些階段,每個階段的目的是什麼

其目的是保證標識符和常數的正確使用,把必要的信息...綜合部分 綜合階段必須根據符號表和中間語言程序產生...目標程序質量,也可以把一個邏輯步驟的工作分為幾遍.

⑵ DO-WHILE循環語句的翻譯程序設計(遞歸下降法、輸出四元式)

///////////////////////////////////////////////////////////////////
////董超勛的for循環語句翻譯 遞歸下降法 輸出三地址碼 /////////////

#define MAX 100
#include<iostream.h>
#include<stdio.h>
#include<string.h>

char str[MAX];
char ch;
int turn;

char strToken[MAX];
int kind;
int n=0;//存放strtoken[]元素的個數

struct Word//結構體 存放單詞
{
int sort;
char word[MAX];//存放strtoken[]的內容
};
//record[x]=new Word;
Word *record[12];//放所有識別出來的單詞,分別存放他們的編號以及字元串,x是其下標

////////////////////詞法分析///////////////////////
int buffer()//載入
{
int i=0;

cout<<"輸入程序,以「#」作為結束標志。"<<endl;

for(int n=0;n<=MAX;n++)
{
for(;i<=MAX;i++)
{
scanf("%c",&str[i]);
/////////////cin>>str[i]不可用,用C語言讀入字元。
if(str[i]=='#')
break;///////如果尾數為識別碼#,則表示程序讀完,跳出循環.
}
break;
}

return(i);
}

bool IsLetter(char ch)///////////判斷是否是字母
{
if(ch>=65&&ch<=90||ch>=97&&ch<=122)
return(true);
else
return(false);
}

bool IsDigit(char ch)//////////判斷是否是數字
{
if(ch>=48&&ch<=57)
return(true);
else
return(false);
}

char GetChar(int i)///////讀取字元
{
char ch;
ch=str[i];

return(ch);
}

char GetBC(char ch)////判斷是不是空格或者換行,如果是,直接讀取下一個字元直道不再空白為止
{
if(ch==32||ch==10)
{
turn++;
ch=GetChar(turn);
ch=GetBC(ch);/////////遞歸實現

return(ch);
}
else
return(ch);
}

void Concat()/////////////連接,即為strtoken[]賦值
{
strToken[n]=ch;
n++;
}

int Reserve()/////以單詞為單位查找保留字,是則返回編碼,不是則返回0,用來區分標志符和保留字
{
if(strcmp(strToken," DIM\0")==0)///////調用strcmp函數實現,
return(1);

else if(strcmp(strToken,"for\0")==0)
return(2);

else if(strcmp(strToken,"step\0")==0)
return(3);

else if(strcmp(strToken,"until\0")==0)
return(4);

else if(strcmp(strToken,"do\0")==0)
return(5);

else
return(6);
}

void clear()
{
n=0;
}

/////////////*語法遞歸分析*/////////////////
int A(int * c,int & q)
{
if(c[q++]==3)
{
if(c[q]==7)
{ q++;
return 1;
}
else {cout<<"step右部出錯"<<endl;return 0;}
}else {cout<<"error 'step'"<<endl;return 0;}
}

int B(int * b,int & o)
{
if(b[o++]==4)
{
if(b[o]==7)
{ o++;
return 1;
}
else {cout<<"until右部出錯"<<endl;return 0;}
}else {cout<<"error 'until'"<<endl;return 0;}
}

int S2(int * d,int & h)
{
if(d[h++]==6)
{
if(d[h++]==8)
{
if((d[h]==6||d[h]==7)) {h++; return 1;}
else {cout<<"賦值語句右部出錯 "<<endl;return 0;}
}else {cout<<"賦值語句缺少賦值運算符 "<<endl;return 0;}
}else {cout<<"賦值語句左部出錯 "<<endl;return 0;}
}

int S1(int * m,int & n)
{
if(S2(m,n))
{
if(A(m,n))
{
if(B(m,n)) return 1;
else return 0;
}else return 0;
}else return 0;
}

int S(int *a,int & z)
{
if (a[z++]==2)
{
if (S1(a,z))
{
if(a[z++]==5)
{
if(S2(a,z))
{
cout<<"succeed!"<<endl;return 1;
}else return 0;
}else {cout<<"error 'do'"<<endl; return 0;}
}else return 0;
}else {cout<<"error 'for'"<<endl; return 0;}
}

void main()
{

cout<<"*************產生式***************"<<endl;// for step until do i j =
cout<<" S ->for S1 do S2"<<endl; // 編號 2 3 4 5 6 7 8
cout<<" S1 ->S2AB"<<endl;
cout<<" S2 ->i=j"<<endl;
cout<<" A ->stepj"<<endl;
cout<<" B ->untilj"<<endl;
int num;

turn=0;
num=buffer()-1;
int x=0;//計識別的單詞的個數

for(;turn<=num;turn++)//總循環,ch存放剛讀入的字元,strtoken[]存放已識別的標志付或保留字,turn是數組str[]的下標
{
ch=GetChar(turn);
ch=GetBC(ch);

if(IsLetter(ch))
{
while(IsLetter(ch)&&turn<=num||IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}

strToken[n]='\0';
ch=NULL;//此ch不是標志符中的符號
turn=turn-1;

kind=Reserve();
record[x]=new Word; record[x]->sort=kind;//12345或6
//cout<<kind; //測試
cout<<"(";
for(int i=0;i<n;i++)
{
record[x]->word[i]=strToken[i];
cout<<record[x]->word[i];//輸出識別的標志符或保留字
}
cout<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();
x++;

}

else if(IsDigit(ch))
{
while(IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}

ch=NULL;
turn=turn-1;

kind=7;
//////////////
record[x]=new Word;

record[x]->sort=kind;
////////////////

cout<<"(";

for(int i=0;i<n;i++)
{

record[x]->word[i]=strToken[i];
cout<<record[x]->word[i];
}
cout<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();x++;

}

else if(ch=='=')
{
kind=8;
///////
record[x]=new Word;
record[x]->word[0]='=';
record[x++]->sort=kind;
cout<<"(=,"<<kind<<")"<<endl;

}

else
cout<<"error input!"<<endl;
}

//////////////////////*語法分析*////////////////
//int y;

/*for(y=0;y<x;y++)
{cout<<record[y]->sort<<" ";//列印單詞的編號 。

}cout<<endl;*/

int ana[MAX];//存放詞法分析得到的單詞序列的編號的序列
int m;
for(m=0;m<x;m++)
{
ana[m]=record[m]->sort;//將sort作為數組保存起來

}
/////////語法分析///////
int j=0;

///////////////////制導翻譯//////////////////
if(!S(ana,j)) cout<<"語法出錯!"<<endl;
else
{ cout<<"三地址碼如下:"<<endl;
cout<<"100 ";
int i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<record[2]->word[0];
i=0;
while(record[3]->word[i]!='\0')
cout<<record[3]->word[i++];cout<<endl;
cout<<"101 goto 103"<<endl;
cout<<"102 ";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<":=";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<"+";
i=0;
while(record[5]->word[i]!='\0')
cout<<record[5]->word[i++];cout<<endl;
cout<<"103 if ";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<"<";
i=0;
while(record[7]->word[i]!='\0')
cout<<record[7]->word[i++];
cout<<" goto 105"<<endl;
cout<<"104 goto 107"<<endl;
cout<<"105 ";
i=0;
while(record[9]->word[i]!='\0')
cout<<record[9]->word[i++];cout<<":=";
i=0;
while(record[11]->word[i]!='\0')
cout<<record[11]->word[i++];cout<<endl;
cout<<"106 goto 102"<<endl;
cout<<"107 end"<<endl;

}

}

⑶ 誰有條件語句,while循環語句的四元式生成

所謂四元式是一種表示中間代碼的方式,跟三元式、波蘭式、逆波蘭式的目的是一樣的,但四元式在表示簡單賦值語句方面非常直觀明了,四元式的格式: (操作符,第一操作數,第二操作數,保存結果的變數) 例如:k:=k+1 四元式寫成:(+,k,1,k) 如果表達式右邊只有單操作數,那就相應位置無值,如: k:=+1 四元式為:(+,-,1,k) 遇到邏輯條件表達式就要分別給出條件為真時的轉移路徑和條件為假時的轉移路徑,如: if k>1 四元式為:(j>,k,1,?) ,表示條件為真的時候要轉移到的地址「?」 (j,-,-,?),表示條件為假時無條件轉移到這個地址「?」 「?」表示的地址可以用地址回填的方法確定 假設起始地址是100 begin 100:(+,-,100,k) 101:(+,i,j,t1) 102:(j>,k,t1,104) 103:(j,-,-,106) 104:(-,k,1,k) 105:(j,-,-,102) 106:(*,i,i,t2) 107:(*,j,j,t3) 108:(-,t2,t3,k) 109:(+,-,0,i) 110:(+,-,0,j) end

⑷ 編譯原理四元式

四元式的一般形式為(op, arg1, arg2, result),其中:op為一個二元(也可以是零元或一元)運算符。arg1和arg2為兩個運算對象,可以是變數、常數或者系統定義的臨時變數名。result為運算結果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.

⑸ 寫出下面語句產生的四元式序列,求答案,謝謝了!

Dim x As Integer If x Then print x Else Print x+1

⑹ 編譯原理用C++生成四元式的程序,如果把生成四元式當成一個類來寫,那這個類應該有哪些函數

四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG@及運算結果RESULT。
你所有的事情也都是圍繞這四個東東來做呀,間接地就是生成「三地址指令」或是轉換成「語句」(例如 if B rop C goto L)之類的。

⑺ 編譯原理 四元式

四元式是一種比較普遍採用的中間代碼形式。

代碼段的四元式表達式:

101 T:=0 (表達式為假的出口)

103 T:=1 (表達式為真的出口)

因為用戶的表達式只有一個A<B,因此A<B的真假出口就是表達式的真假出口,所以

100: if a<b goto 103 (a<b為真,跳到真出口103)

101: T:=0(否則,進入假出口)

102: goto 104 (要跳過真出口,否則T的值不就又進入真出口了,為真)

103: T:=1

104:(程序繼續執行)

(7)四元式是哪個階段的輸出數據擴展閱讀:

四元式是一種更接近目標代碼的中間代碼形式。由於這種形式的中間代碼便於優化處理,因此,在目前許多編譯程序中得到了廣泛的應用。

四元式實際上是一種「三地址語句」的等價表示。它的一般形式為:

(op,arg1,arg2,result)

其中, op為一個二元 (也可是一元或零元)運算符;arg1,arg2分別為它的兩個運算 (或操作)對象,它們可以是變數、常數或系統定義的臨時變數名;運算的結果將放入result中。四元式還可寫為類似於PASCAL語言賦值語句的形式:

result ∶= arg1 op arg2

需要指出的是,每個四元式只能有一個運算符,所以,一個復雜的表達式須由多個四元式構成的序列來表示。例如,表達式A+B*C可寫為序列

T1∶=B*C

T2∶=A+T1

其中,T1,T2是編譯系統所產生的臨時變數名。當op為一元、零元運算符 (如無條件轉移)時,arg2甚至arg1應預設,即result∶=op arg1或 op result ;對應的一般形式為:

(op,arg1,,result)

(op,,,result)

⑻ 編譯原理中 關於四元式序列 的題~~~!

(1)if a<b goto (7) /* (7)是整個布爾表達式的真出口 */
(2) goto (3)
(3) if c<d goto (5)
(4) goto (p+1) /* (p+1)是整個布爾表達式的假出口 */
(5) if e>f goto (7)
(6) goto (p+1)

⑼ 完成賦值語句,條件語句和WHILE循環語句的四元式生產程序構造,測試用例要求不少於3

改了個JAVA上的事例,輸入0-5的數字,然後加1輸出的程序,應該能滿足你的要求。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class te...st_01 { public static void main (String args[]) throws IOException{ BufferedReader buf = null; buf = new BufferedReader(new InputStreamReader(System.in)); String str = null; while (true){ { System.out.print("請輸入數字:"); try { str = buf.readLine(); } catch (IOException e) { e.printStackTrace(); } int i = -1; try { i = Integer.parseInt(str); if (i>5 |i

⑽ 跪求!我們的作業。 題目:將布爾表達式轉換成四元式的程序實現

我自到

閱讀全文

與四元式是哪個階段的輸出數據相關的資料

熱點內容
武漢葵花葯店代理怎麼樣 瀏覽:135
人事代理是指哪些 瀏覽:445
紅軍為什麼不投入轉會市場 瀏覽:138
資料庫一頁多少k 瀏覽:568
華為換蘋果x手機怎麼轉移數據 瀏覽:353
張氏絕密技術有哪些 瀏覽:928
如何在電腦上安裝顯卡驅動程序 瀏覽:174
如何編apk程序 瀏覽:861
上匯眼鏡市場怎麼樣 瀏覽:710
夏門金龍技術部員工月工資多少 瀏覽:584
社保卡上信息與交費怎麼查 瀏覽:737
如何編寫串列口初始化程序 瀏覽:389
南昌菜市場在哪個位置擺攤 瀏覽:740
讀醫學類大專所學的專業技術如何 瀏覽:491
中國石頭花架批發市場在哪個地方 瀏覽:646
目前市場上什麼狗最便宜 瀏覽:174
行動預設數據是什麼 瀏覽:863
地球科學與技術專業是什麼 瀏覽:543
查詢百萬條數據會出現什麼情況 瀏覽:462
中國電信政企部和市場部哪個好 瀏覽:145