導航:首頁 > 源碼編譯 > 編譯原理四大分析器

編譯原理四大分析器

發布時間:2023-05-31 11:13:22

編譯原理 遞歸下降分析器

自頂向下分析法(遞歸下降分析程序構造)
E-->T/E+T
T-->F/T*F
F-->i/(E)
步驟 棧 輸入字元串 狀態
0 #E i1*(i2+i3)# 初始化
1 #T i1*(i2+i3)# E-->T
2 #T*F i1*(i2+i3)# T-->T*F
3 #T*i i1*(i2+i3)# F-->i
4 #F* *(i2+i3)# 匹配
5 #F (i2+i3)# 匹配
6 #(E) (i2+i3)# E-->(E)
7 #(E i2+i3)# 匹配
8 #(E+T i2+i3)# E-->E+T
9 #(E+F i2+i3)# T-->F
10 #(E+i i2+i3)# F-->i
11 #(E+ +i3)# 匹配
12 #(E i3)# 匹配
13 #(T i3)# E-->T
14 #(F i3)# T-->F
15 #(i i3)# F-->i
16 #( )# 匹配
17 # # 接受
所以可以寫出
PROCEDURE E
BEGIN
T;
WHILE SYM='+' THEN ADVANCE;T END
END;
PROCEDURE T
BEGIN
F;
WHILE SYM='*' THEN ADVANCE;F END
END;
PROCEDURE F
BEGIN
IF SYM='i' THEN ADVANCE END
ELSE
IF SYM='(' THEN
BEGIN ADVANCE;E;
IF SYM=')' THEN ADVANCE;
ELSE ERROR;END
END;

② 提問 編譯原理問題(高分)

詞法分析 的作用是把輸入的源語句轉化成單詞形式
第五個最右推導沒給要推出的句子 如果是 cbb 那過程也不對
E->CB

C->c

B->b

最右推導的分析為

1 CB

2 Cb

3 cb
你給的文法有問題吧,最右推導通俗的說 就是只按照最右邊的非終結符推導

你這些都是要干什麼的題,如果要考試,後面那幾道的類型幾乎必考!!!

③ 編譯原理中詞法分析器

或許……可以通過這個符號的前面的第一個有實際意義的「單詞」的屬性來判斷,因為如果它是加減號,
那麼它「前面」的那個單詞必然具有可以被它加或減的屬性,否則就是正負號。
如果前一個單詞屬性是標示符或者某種數據類型(比如整型、字元串型),
那麼這個符號就是加減號而不是正負號,如果前面一個單詞
是關鍵字或運算符這類不可能承受「加減」操作的這種,這個號就是正負號。
個人覺得這個問題應該沒有一針見血或者一勞永逸的辦法,就得一點一點分析吧。
PPPS:還有一策就是甭搭理它,交給語義分析辦。

④ 編譯原理課程-簡單詞法分析器設計(C或C++)

分類: 電腦/網路 >> 程序碰陵設計 >> 其他編程語言
問題描述:

完成以下正則文法所描述的Pascal語言子集單詞符號的詞法分析程序。

<標識符>→字母| <標識符>字母| <標識符>數字

<無符號整數>→數字| <無符號整數>數字

<單字元分界符> →+ |- |* |; |(|)

<雙字元分界符>→<大於>=|<小於>=|<小於>>|<冒號>=|<斜豎>*

<小於>→<

<等於>→=

<大於>→>

<冒號> →:

<斜豎> →/

該語言的保留字 :begin end if then else for do while and or not

說明:

1 該語言大小寫不敏感。

2 字母為a-z A-Z,數字為0-9。

3可以對上述文法進行擴充和笑坦戚改造。

4 『/*……*/』為程序的注釋部分。

[設計要求]

1、 給出各單詞符號的類別編碼。

2、 詞法分析程序應能發現輸入串中的錯誤。

3、 詞法分析作為單獨一遍編寫,詞法分析結果為二元式序列組成的中間文件。

4、設計兩個測試用例(信宴盡可能完備),並給出測試結果。

解析:

這種問題 …… 會有人解答嗎?

⑤ 編譯原理筆記7:語法分析(1)語法分析器的任務、語法錯誤的處理

語法分析器的兩項主要任務,分別:

源程序中的錯誤可以分為詞法/語法錯誤、語義錯誤兩類。前者主要形式是命名不合虛悄雹法、關鍵字書寫錯誤、語法結構有問題(比如缺分號、該配對的東西不配對)等;後者則可分為靜態/動態兩種,靜態例如類型使用錯誤、參數使用錯誤等,動態語義錯誤則是無窮遞歸這類邏輯性的問題。

例如:

緊急恢復:x = a+b+d; // 丟運芹棄掉 b 後的記號,直到遇到 +

短語級恢復: x = a+b; // 加入分號

在寫程序時,要養成減少錯誤的好習慣:每次用變數、參數時,要在使用之前進行初始化,並在差帆直接使用之前檢查一下是否出現值為空等問題,防止出現不可預知的錯誤

⑥ 編譯原理課程設計-詞法分析器設計(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所示:

具體的你在修改修改吧

⑦ 編譯原理 詞法分析器中如何得到注釋內容

不同的編譯器的詞法分析器不盡相同,主要看編譯器的設計者是怎麼設計的:
有的是識別出/*和*/後,將其間的字元作為注釋。如VC++,WIN-TC等。
有的是識別出//後,將//之後與換行符前的所有文字當作注釋。如VC++等。

java的注釋和c語言、c++的注釋似乎有點區別,但是也差不多啦!
除了以上兩種之外,還有第三種,文檔注釋:
/** ...... */ 注釋若干行,並寫入javadoc 文檔。
不過我認為這種可以算在第一種之內,當成第一種處理也未嘗不可啊!

⑧ 急急急,編譯原理

using namespace std;

struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;

int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL;
return 1;
}
else
{
T = new BiNode;
T->data = *s1;
int i;
for ( i=0; i<len; i++) if (s2[i]==*s1) break;
CreateBiTree(T->lchild, s1+1, s2, i);
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1));
}
return 1;
}

int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T = NULL;
return 1;
}

int ATraverse(BiTree &T)
{
if (T==NULL) return 1;
ATraverse(T->lchild);
ATraverse(T->rchild);
cout<<T->data;
return 1;
}

main()
{
char a[2000],b[2000];
while(cin>>a>>b)
{
BiTree T;
int count=0;
int n;
for(n=0;a[n]!='\0';n++);
CreateBiTree(T,a,b,n);
ATraverse(T);
cout<<" ";

cout<<endl;
DestroyBiTree(T);

⑨ 編譯原理課程設計求助

OMG....
好像我們馬上要交了。。

閱讀全文

與編譯原理四大分析器相關的資料

熱點內容
收件伺服器怎麼樣 瀏覽:46
建築設計規范pdf 瀏覽:98
如何合並兩個pdf 瀏覽:174
刷機包必須要解壓的單詞 瀏覽:483
android課表實現 瀏覽:864
頭條app在哪裡能看見有什麼活動 瀏覽:511
冰櫃壓縮機電容80歐 瀏覽:609
安卓各個版本圖標什麼樣 瀏覽:152
無錫哪裡有製作手機app 瀏覽:538
php字元串轉json數組 瀏覽:6
數控網路編程課程有哪些 瀏覽:482
python30特效程序編碼 瀏覽:392
安卓跟蘋果互傳照片用什麼 瀏覽:848
原創小說app哪個好看 瀏覽:97
首台湖南造鯤鵬伺服器雲伺服器 瀏覽:268
redhatphp 瀏覽:456
android智能家居藍牙 瀏覽:646
pt螺紋編程 瀏覽:451
手機電音app哪個好 瀏覽:749
checksum命令 瀏覽:637