一、實驗目的:
利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。
編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。
二、實驗原理
每個非終結符都對應乙個子程式。
該子程式根據下乙個輸入符號(select集)來確定按照哪乙個產生式進行處理,再根據該產生式的右端:
三、實驗要求說明
輸入單詞串,以「#」結束,如果是文法正確的句子,則輸出成功資訊,列印「success」,否則輸出「error」,並指出語法錯誤的型別及位置。
例如:
輸入begin a:=9;x:=2*3;b:=a+x end #
輸出success
輸入x:=a+b*c end #
輸出『end' error
四、實驗步驟
1.待分析的語言的語法(參考p90)
2.將其改為文法表示,至少包含
–語句
–條件
–表示式
3. 消除其左遞迴
4. 提取公共左因子
5. select集計算
6. ll(1)文法判斷
7. 遞迴下降分析程式
**如下:
#include #include實驗結果:#include
void match(); //
匹配的方法
void pre(); //
對語法進行預處理
void statement(); //
匹配語法宣告(賦值)
void expression(); //
匹配運算子
void term(); //
匹配*/運算子
void factor(); //
匹配括號
char temp[500],test[500
];char
ch;const
char *keyword[6]= ; //
儲存保留字
int i=0,num,n,ednum=0,bnum=0
;int
main()
temp[i]='#'
; i++;
temp[i]='\0'
; i=0
; match();
pre();
}void
match()
if((ch>='
a'&&ch<='
z')||(ch>='
a'&&ch<='
z'))
test[n++]='\0'
;
for(n=0; n<6; n++)
if(num==6
)
break
; }
}i--;
if(num==10
) }
if(ch>='
0'&&ch<='
9')
else
else
break
;
case
'ch=temp[i++];
if(ch=='='
) else
if(ch='
>
')
else
break
;
case
'>':
ch=temp[i++];
if(ch=='='
) else
break
;
case'=
':num=25;printf("
[%c,%d]\n
",ch,num);break
;
case';
':num=26;printf("
[%c,%d]\n
",ch,num);break
;
case'(
':num=27;printf("
[%c,%d]\n
",ch,num);break
;
case')
':num=28;printf("
[%c,%d]\n
",ch,num);break
; }
}}void pre()
statement();
while(num==26
)
if(bnum!=1
)
return;}
void statement()
else
} else
}return;}
void expression()
return;}
void term()
return;}
void factor()
else
if(num==27
) else
} else
return
;}
作業12 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
遞迴下降語法分析
看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式 其bnf正規化如下 operator operator operator operator expression 0,1,2,3,4,9 expression operator expres...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...