編譯原理考試題西安科技大學
⑴ 一些關於編譯原理的題目(選擇,判斷)
2年前還會做,現在都忘了
⑵ 編譯原理:小題如下,求學霸幫忙
短語:1a,2Sb,3ba,4baSb
句柄:a
直接短語:a,Sb
語法樹推導:
S=>AB
=>bBB
=>baB
=>baSb
語法樹貌似在這里粘貼不上。
⑶ 編譯原理的練習題,會的幫下忙。
1、編譯方法中自底向上的語法分析演算法有:簡單優先分析演算法、算符優先分析演算法、SLR方法、LR(K)方法、LALR(K)方法,自頂向下的語法分析演算法有:遞歸子程序法、LL(K)分析算、預測分析方法。
2、詞法分析器的輸入是源程序的字元流,輸出是詞法記號流。
3、等價
4、(a|b)*(aa|bb)(a|b)*
⑷ 幫我做下兩道簡單的《編譯原理》文法題目,在線等答案O(∩_∩)O謝謝!

⑸ 編譯原理的一個詞法分析題(希望
#include "word.h"
void main(){
menu();
}
///列表生成工具
void makelist(char * text){
char ch[20][20];
int i=0;
int j,k;
while(1){
cin>>ch[i];
if(strcmp(ch[i],"enterend")==0)
break;
i++;
}
char xch[20];
for(k=0;k<i;k++)
{
for(j=0;j<i-1;j++)
{
if(strcmp(ch[j],ch[j+1])>0)
{strcpy(xch,ch[j]);strcpy(ch[j],ch[j+1]);strcpy(ch[j+1],xch);}
}
}
ofstream out(text);
for(k=0;k<i;k++)
{
out<<ch[k]<<endl;
}
}
//單詞分離
void wordfind(char * text){
cout<<"請輸入要分析的文件名:"<<endl;
cin>>text;
char buf;
int i=0;
int len=0;
char buff[2048];
ifstream fin(text);
//源文件的規則化
while(!fin.eof()){
buf=fin.get();
if(buf=='\n'||buf==';')
buf=' ';
buff[len]=buf;
len++;
}
char * buffer=new char[len];
strncpy(buffer,buff,len);
//單詞提取
ofstream out(Words);
for(i=0;i<len-1;i++)
{
if((buffer[i]>='a'&&buffer[i]<='z')||(buffer[i]>='A'&&buffer[i]<='Z')||(buffer[i]>='0'&&buffer[i]<='9'))
{
out<<buffer[i];
}
else
{
if(buffer[i]!=' ')
{
if(buffer[i-1]!=' ')
out<<endl;
out<<buffer[i]<<endl;
}
else
{
if(buffer[i-1]!=' ')
out<<endl;
}
}
}
}
//單詞判斷
bool casein(char * text,char * words){
char word[10];
int k=0;
ifstream fin(text);
while(!fin.eof()){
fin>>word;
if(k=strcmp(word,words)==0)
return TRUE;
else
if(k>0)
return FALSE;
}
return FALSE;
}
//單詞分組
int switchgroup(char * word){
if(casein(Word,word))
return 1;
if(casein(Char,word))
return 2;
if(word[0]==':')
return 3;
else
return 4;
}
//使用集 各參數的使用
void fanal(){
int kind;
int lastkind=0;
char word[10];
ifstream fin(Words);
while(!fin.eof()){
fin>>word;
kind=switchgroup(word);
if(kind==3)
{
fin>>word;
kind=switchgroup(word);
if(word[0]=='=')
{
print(kind,":=",lastkind);
}
}
else
{
print(kind,word,lastkind);
}
lastkind=kind;
}
}
//單詞類型分析
int startwith(char * word){
if(word[0]>='0'&&word[0]<='9')
return NUMBER;
else
return CHAR;
}
//顯示列印
void print(int k,char * word,int l){
if(k==1)
cout<<"類型是: 關鍵字 名字是: "<<word<<" 值是:"<<word<<endl;
if(k==2)
cout<<"類型是: 特殊符號 名字是: "<<word<<" 值是:"<<word<<endl;
if(k==4)
if(l==1)
cout<<"類型是: 變數 名字是: "<<word<<" 值是:"<<word<<endl;
if((l==2)&&startwith(word))
cout<<"類型是: 變數 名字是: "<<word<<" 值是:"<<word<<endl;
if((l==2)&&!startwith(word))
cout<<"類型是: 常量 名字是: "<<word<<" 值是:"<<word<<endl;
}
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
#define BUFSIZE 2048
#define CHAR 1
#define NUMBER 0
//函數聲明
bool casein(char *);
void wordfind(char *);
void makelist(char *);
int switchgroup(char * );
void print(int,char *,int);
void menu();
void menu2();
int startwith(char *);
//全局變數定義
char Word[]="wordlist.txt";
char Char[]="charlist.txt";
char readfile[]="readfile.txt";
char Words[]="wordslist.txt";
charlist.txt的內容 可以隨便加你要的符號
(
)
*
+
-
/
=
wordlist.txt 關鍵字表 也可以隨便寫 我寫的是
else
end
if
read
repeat
then
until
write
以上都是一個詞一行
還有readfile.txt 是被分析文件 自己寫吧.你有誠意給我沖10QB 447322160 我寫了4個小時
⑹ 給力!2011年新年散分啦。高分求助編譯原理高手幫忙做幾道模擬題
三、( 8 分)化簡文法 G[S] :
S → ASe | BCaD | aD | AC
A → Cb | DBS
C → bC | d
B → Ac
D → Ad
化簡後: S → ASe|AC A → Cb C → bC | d
四、( 12 分) 設 L í {a,b,c}* 是滿足下述條件的符號串構成的語言:
(1)若出現 a ,則其後至少緊跟兩個 c ;
(2)若出現 b ,其後至少緊跟一個 c 。
試構造識別 L 的最小化的 DFA ,並給出描述 L 的正規表達式。
答:DFA 如圖所示。相應的正規式為 (c|acc|bc)* 。
五、( 12 分) 已給文法 G[S] : S → SaP | Sf | P P → qbP | q
將 G[S] 改造成 LL ( 1 )文法,並給出 LL ( 1 )分析表。
答:改造後的文法: S → PS' S' → aPS'| fS' | e P → qP' P' → bP | e
各候選式的 FIRST 集,各非終結符的 FOLLOW 集為
產生式 FIRST 集 FOLLOW 集
S → PS' {q} {#}
S' → aPS'
→ fS'
→ e {a}
{f}
{ e } {#}
P → qP' {q} {a,f,#}
P' → bP
→ e {b}
{ e } {a,f,#}
LL(1) 分析表為
六、( 12 分) 給定文法 G[S] : S → Aa|dAb|Bb|dBa A → c B → c
構造文法 G[S] 的 LR ( 1 )分析表。
分析表如下圖所示
七、( 8 分) 將下面的條件語句表示成逆波蘭式和四元式序列:
if a>b then x:=a+b*c else x:=b-a;
答:( 1 )逆波蘭式:
,其中, BLE 表示汪或等於時的轉向指令; [ … ] 表示標號。
( 2 )四元式:
(1) ( j>, a, b, (3))
(2) ( j, , , (7) )
(3) ( *, b, c, T1)
(4) ( +, a, T1, T2)
(5) ( :=, T2, , x)
(6) ( j, , , (9))
(7) ( -, b, a, T3)
(8) ( :=, T3, , x)
(9) ( … … )
八、( 8 分) 給定基本塊:
A:=3*5
B:=E+F
C:=A+12
D:=E+F
A:=D+12
C:=C+1
E:=E+F
假定出基本塊後,只有 A 、 C 、 E 是活躍的,給出用 DAG 圖完成優化後的代碼序列。
答:化簡後的的四元式序列為
A :=D+12
E :=E+F
C :=28
⑺ 求解編譯原理的一道題:設有文法如下
首先要做這題你要知道判別文法類型
包括四個層次:
0-型文法(無限制文法或短語結構文法)包括所有的文法。該類型的文法能夠產生所有可被圖靈機識別的語言。可被圖靈機識別的語言是指能夠使圖靈機停機的字串,這類語言又被稱為遞歸可枚舉語言。注意遞歸可枚舉語言與遞歸語言的區別,後者是前者的一個真子集,是能夠被一個總停機的圖靈機判定的語言。
1-型文法(上下文相關文法)生成上下文相關語言。這種文法的產生式規則取如 αAβ -> αγβ 一樣的形式。這里的A 是非終結符號,而 α, β 和 γ 是包含非終結符號與終結符號的字串;α, β 可以是空串,但 γ 必須不能是空串;這種文法也可以包含規則 S->ε ,但此時文法的任何產生式規則都不能在右側包含 S 。這種文法規定的語言可以被線性有界非確定圖靈機接受。
2-型文法生成上下文無關語言。這種文法的產生式規則取如 A -> γ 一樣的形式。這里的A 是非終結符號,γ 是包含非終結符號與終結符號的字串。這種文法規定的語言可以被非確定下推自動機接受。上下文無關語言為大多數程序設計語言的語法提供了理論基礎。
3-型文法(正規文法)生成正規語言。這種文法要求產生式的左側只能包含一個非終結符號,產生式的右側只能是空串、一個終結符號或者一個非終結符號後隨一個終結符號;如果所有產生式的右側都不含初始符號 S ,規則 S -> ε 也允許出現。這種文法規定的語言可以被有限狀態自動機接受,也可以通過正則表達式來獲得。正規語言通常用來定義檢索模式或者程序設計語言中的詞法結構。
正規語言類包含於上下文無關語言類,上下文無關語言類包含於上下文相關語言類,上下文相關語言類包含於遞歸可枚舉語言類。這里的包含都是集合的真包含關系,也就是說:存在遞歸可枚舉語言不屬於上下文相關語言類,存在上下文相關語言不屬於上下文無關語言類,存在上下文無關語言不屬於正規語言類。
1)本題應該是--上下文無關文法
句子是產生式在推導時「僅僅有終結符」的任何一步
2)%mm%nn 是一個句子
由於下面一題的圖我等級不夠 不能貼圖 發你郵箱
⑻ 《編譯原理》的一道題 寫出表達式(a+b*c)/(a+b)-d的逆波蘭表示和三元式序列
逆波蘭式可能是這樣,上學期剛考完一個假期有點忘了(abc)(ab)d+*/+-
三元式已經忘得一干二凈了
⑼ 求教三道關於編譯原理的計算題``比較簡單希望步驟盡量詳細

