❶ 編譯原理,構造SLR分析表時,產生式中出現F的星閉包該怎麼處理
仔細分析你的文法
F->F*|a|b也就是說,寫成正則表達式的話 F就是[ab]*
同樣的T也是[ab]*
你的整個文法就是[ab]+ [ab\+]*第一個+是+closure,第二個+是符號+,所以用了\符號
個人感覺這個文法是有問題的,因為根本不需要用上下文無關文法表達,只需要正則表達式就可以了。
❷ SLR語法分析器的Java實現
沒有實際利益的不說
❸ slr的「單反相機」縮寫
單鏡頭反光相機(Single Lens Reflex,縮寫為SLR),也被簡稱為「單反」或「單反相機」。詳見網路詞條:單鏡頭反光相機
SLR(Satellite Laser Ranging,縮寫為SLR),即衛星激光測距,利用安置在地面上的衛星激光測距系統發射的激光脈沖,跟蹤裝有激光反射棱鏡的人造地球衛星,以測定站星距離的技術和方法。
編譯技術裡面的一種語法分析技術
SLR又一個意思是編譯技術裡面的一種語法分析技術,又叫簡單的LR分析技術,而LR分析技術是一種高效的、自下而上的分析一大類上下文無關文法的分析技術。L是指從左向右掃描,R是指構造最右推導的逆。
❹ 編譯原理用C語言實現基於LR(1)或SLR(1)語法分析程序代碼,最好還有報告,急。。。
#include <iostream>
using namespace std;
#define m 45
#define n 100
#define t 10
int main()
{
FILE *fp;
char filename[20],c[n];
printf("Type the file name which you want to open:");
scanf("%s",&filename);
fp=fopen(filename,"r+"); /*以r-只讀方式打開指定文件*/
if((fp=fopen(filename,"r"))==NULL) /*文件不存在輸出錯誤*/
{cout<<"文件不存在!"<<endl;exit(-1);}
cout<<"文件中內容如下:"<<endl;
for(int j=0;!feof(fp);j++){
c[j]=fgetc(fp);//從流中讀取字元
}
char keyword[m][t]={"include","int","string","cout","cin","auto","break","case","char","class","const",
"continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline",
"int","long","new","operator","private","protected","public","register","return","short","sizeof","static",
"struct","switch","template","this","typedef","union","virtual","void","while"};//關鍵字數組
char a[t],*p=c,*q=a,*s=a;
bool w=0,r=0;
int i=0;
for(i=0;i<10;i++)a[i]=NULL;//初始化臨時數組
while (*p !=NULL){
q=s=a;
if((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')||*p=='_'){//識別標識符
*q=*p;p++;q++;
while ((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')||(*p>='0'&&*p<='9')||*p=='_'){
*q=*p;p++;q++;
}
for(i=0;i<m;i++)if(strcmp(keyword[i],a)==0){r=1;break;}
if(r==1){cout<<"關鍵字為:";r=0;}
else cout<<"標識符為:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
}
else if(*p=='\''){//識別字元常量
p++;
while(*p!='\''){
*q=*p;
p++;
q++;
}
cout<<"字元常量為:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(*p=='\"'){//識別字元串常量
p++;
while(*p!='\"'){
*q=*p;
p++;
q++;
}
cout<<"字元串常量為:";
while(s!=q){
cout<<*s;
s++;
}
cout<<endl;
for(i=0;i<t;i++)a[i]=NULL;
p++;
}
else if(*p=='+'||*p=='-'||*p=='*'||*p=='/'||*p=='='||*p=='%'||*p=='/'){//識別運算符
cout<<"運算符為:"<<*p;
cout<<endl;
p++;
}
else if(*p==';'||*p==','){//識別分解符
cout<<"分界符為:"<<*p;
cout<<endl;
p++;
}
else if(*p>='0'&&*p<='9'){
s=q=a;
*q=*p;p++;q++;
while(*p>='0'&&*p<='9'||*p=='.'){
*q=*p;p++;q++;
}
while(s!=q){
if(*s=='.'){w=1;break;}//識別實型常量
s++;
}
s=a;
if(w ==1){
cout<<"實型常量為:";
while(s!=q){
cout<<*s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
else {
cout<<"整型常量為:";
while(s!=q){//識別整型常量
cout<<*s;
s++;
}
for(i=0;i<t;i++)a[i]=NULL;
}
cout<<endl;
}
else p++;
}
return 0;
}
❺ 編譯原理語法分析有哪幾種方法
語法分析有自上而下和自下而上兩種分析方法
其中
自上而下:遞歸下降,LL(1)
自下而上:LR(0),SLR(1),LR(1),LALR(1)
❻ C語言的SLR(1)分析表
編譯原理 還是SLR 哎 最頭疼這個
寫個LL(1)都花了 3天 盡是些小問題
書上都有演算法 自己看吧
❼ 編譯原理怎麼判斷是否為slr文法
LL(1)就是向前只搜索1個符號,即與FIRST()匹配,如果FIRST為空則還要考慮FELLOW.
LR需要構造一張LR分析表,此表用於當面臨輸入字元時,將它移進,規約(即自下而上分析思想),接受還是出錯.
LR(0)找出句柄前綴,構造分析表,然後根據輸入符號進行規約.
SLR(1)使用LR(0)時若有沖突,不知道規約,移進,活移進哪一個,所以需要向前搜索,則只把有問題的地方向前搜索一次.
LR(1)1.在每個項目中增加搜索符.2.舉個列子如有A->α.Bβ,則還需將B的規則也加入.
LALR(1)就是假如兩個產生式集相同則將它們合並為一個,幾合並同心集.
❽ 高分求 關於 編譯原理 SLR(1)語法分析器的設計與實現 的源代碼 以及相關資料
已發,請查收
❾ 編譯原理LR分析法中的SLR(1)分析表和LR分析過程、語法樹怎麼求
第二題和第三題拿去,剛做的:
由B->cAa|c就可知該文法不是LR(0)文法了