用了半天時間做的一個簡單的遞迴下降分析器
阿新 • • 發佈:2019-02-19
用來分析簡單的表示式是否合法的一個程式:
以下是原始碼:
include<stdio.h>
#include<stdlib.h>
char ch=' ';//就算是一個讀數指標吧
char express[50];//用來儲存表示式的陣列
static int index=0;//迭代器
FILE *fp;//檔案指標
void get_express();//顧名思義是個得到字串的函式
int IsDigit();//判斷是不是數字
void read();//相當於那個遞迴下降分析器裡面的next
void expression();//表示式
void factor();//因子
void equation();//項
int main(){
get_express();
read();
expression();
if(ch=='#')printf("the expression analysis over");//分析完畢
else
printf("the expression is invalid");//表示式不匹配
getch();
return 0;
}
void get_express(){
int i=0;
if((fp=fopen("express.txt","r"))==NULL)printf("cannot not open the file");
ch=fgetc(fp);
while(ch!=EOF){
express[i++]=ch;
ch=fgetc(fp);
}
}
void read(){
ch=express[index++];
putchar(ch);
}
int IsDigit(){
if(ch>='0'&&ch<='9')return 1;
else
return 0;
}
void expression(){
equation();
while(ch=='+'||ch=='-'){
read();
equation();
}
}
void factor(){
if(IsDigit(ch))read();
else if(ch=='(')
{read();expression();
if(ch==')')read();
else {printf("error2"); }
}
else {printf("error1"); }
}
void equation(){
factor();
while(ch=='/'||ch=='*'){
read();factor();
}
}
以下是表示式的正則表示式:
:::ω1//*
erro1 表示算符不匹配,erro2表示括號不匹配
本遞迴下降分析器只能分析單個數字組成簡單的表示式,因為沒有加詞法分析器,因為我的詞法分析器做的太爛了.,沒有加分析表和識別符號表,界符表和識別符號表..
但程式總體上還是很成功的..
以下是原始碼:
include<stdio.h>
#include<stdlib.h>
char ch=' ';//就算是一個讀數指標吧
char express[50];//用來儲存表示式的陣列
static int index=0;//迭代器
FILE *fp;//檔案指標
void get_express();//顧名思義是個得到字串的函式
int IsDigit();//判斷是不是數字
void read();//相當於那個遞迴下降分析器裡面的next
void expression();//表示式
void factor();//因子
void equation();//項
int main(){
get_express();
read();
expression();
if(ch=='#')printf("the expression analysis over");//分析完畢
else
printf("the expression is invalid");//表示式不匹配
getch();
return 0;
}
void get_express(){
int i=0;
if((fp=fopen("express.txt","r"))==NULL)printf("cannot not open the file");
ch=fgetc(fp);
while(ch!=EOF){
express[i++]=ch;
ch=fgetc(fp);
}
}
void read(){
ch=express[index++];
putchar(ch);
}
int IsDigit(){
if(ch>='0'&&ch<='9')return 1;
else
return 0;
}
void expression(){
equation();
while(ch=='+'||ch=='-'){
read();
equation();
}
}
void factor(){
if(IsDigit(ch))read();
else if(ch=='(')
{read();expression();
if(ch==')')read();
else {printf("error2"); }
}
else {printf("error1"); }
}
void equation(){
factor();
while(ch=='/'||ch=='*'){
read();factor();
}
}
以下是表示式的正則表示式:
·算術表示式定義
<算術表示式> à <算術表示式> ω0 <項> | <項>
<項> à <項> ω1<因子> | <因子>
<因子> à <算術量> | ( <算術表示式> )
<算術量> à <識別符號> | <常數>
:::ω0-/+:::ω1//*
erro1 表示算符不匹配,erro2表示括號不匹配
本遞迴下降分析器只能分析單個數字組成簡單的表示式,因為沒有加詞法分析器,因為我的詞法分析器做的太爛了.,沒有加分析表和識別符號表,界符表和識別符號表..
但程式總體上還是很成功的..