?? recuredesent.cpp
字號:
// RecureDesent.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#define xz sym=adv()
//////////////////////////////////////////////////////////////////////////////////////////////////
// 0-20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
// 保留詞 非保留詞 數字 , ; : . ( ) [ ] .. 無無 + - * / 無 < > 無 <= >= := { } #
//////////////////////////////////////////////////////////////////////////////////////////////////
FILE *fp1;
char ch;
int sym;
void error()
{
printf("%d error!\n ",sym);
}
int chz(char str1[15])//將str1[15]中的字符映射成小寫并判斷是否為str[21][15]中的單詞
{
char str[21][15]={"and","begin","const","div","do","else",
"end","function","if","integer","not","or","procdure",
"program","read","real","then","type",
"var","while","write"};
int i,max,min,mid;
for(i=0;i<=14;i++)
if(str1[i]<='Z'&&str1[i]>='A')
str1[i]=str1[i]+'a'-'A';
max=20;
min=0;
mid=10;
while(min<=max)
{
i=strcmp(str1,str[mid]);
if(i==0) return mid;
else if(i>0){min=mid+1;mid=(max+min)/2;}
else {max=mid-1;mid=(max+min)/2;}
}
return 0;
}
int adv()//遞歸
{
char str1[15];
int t,i=0,sk=0;
float num,xs;
if(ch==' '||sym==24){fscanf(fp1,"%c",&(ch));printf("%c",ch);}//如果ch為空或sym為;即24則讀取下一個字符
while(!feof(fp1)&&i<100)
{
if(((ch)>='a'&&(ch)<='z')||((ch)>='A'&&(ch)<='Z'))//如果字符為字母則放入str1[i]中
{
i=0;
while((((ch)>='a'&&(ch)<='z')||((ch)>='A'&&(ch)<='Z')||((ch)>='0'&&(ch)<='9')))
{
str1[i]=(ch);
i++;
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
}
str1[i]='\0';
t=chz(str1);
if(!t)return 21;//非保留詞返回21
else return t;
}
else if(ch>='0'&&ch<='9')//如果字符為數字則將字符轉化為數值num
{
num=0;
while(ch>='0'&&ch<='9')
{
num=num*10+(ch)-'0';
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
}
if(ch=='.')
{
xs=(float)0.1;
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
while(ch>='0'&&ch<='9')
{
num+=(ch-'0')*xs;
xs*=(float)0.1;
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
}
}
return 22;
}
switch(ch)
{
case '+' :{ch=' ';return 34;}
case '*' :{ch=' ';return 36;}
case ',' :{ch=' ';return 23;}
case ';' :{ch=' ';return 24;}
case '.' :{ch=' ';return 26;}
case '(' :{ch=' ';return 27;}
case ')' :{ch=' ';return 28;}
case '[' :{ch=' ';return 29;}
case ']' :{ch=' ';return 30;}
case '{' :{ch=' ';return 45;}
case '}' :{ch=' ';return 46;}
case '-' :{ch=' ';return 35;}
case '..' :{ch=' ';return 31;}
case '/' :{ch=' ';return 37;}
case '#' :{ch=' ';return 47;}
case '<' :
{
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}sk=1;
if((ch)=='=')
{ch=' ';return 42;}
else {return 39;}
}
case ':' :
{
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
sk=1;
if((ch)=='=')
{ch=' ';return 44;}
else {return 25;}
}
case '>' :
{
{fscanf(fp1,"%c",&(ch));printf("%c",ch);}
sk=1;
if((ch)=='=')
{ch=' ';return 43;}
else {return 40;}
}
default:break;
}
if(sk==0){fscanf(fp1,"%c",&(ch));printf("%c",ch);}
else sk=0;
}
return 48;//超出范圍
}
void F();
void T()//"* /"
{
F();
while(sym==36||sym==37)
{
xz;
F();
}
}
void E()//"+ -"
{
T();
while(sym==34||sym==35)
{
xz;
T();
}
}
void F()
{
if(sym==21||sym==22) xz;//"非保留詞 數字"
else if(sym==27)//"( "
{
xz;
E();
if(sym==28) xz;//" )"
else error();
}
else error();
}
void sentence();//對句子進行語法分析
void CS()//"; end"
{
xz;
sentence();
while(sym==24)
{
xz;
sentence();
}
if(sym==6)xz;
else error();
}
void CT()//"else"
{
if(sym==5)
{
xz;
sentence();
}
}
void EB()//邏輯運算< <= > >=
{
E();
if(sym<=43&&sym>=38)
{
xz;
E();
}
else error();
}
void IT()//非保留詞
{
if(sym!=21)error();
xz;
while(sym==23)
{
xz;
if(sym!=21)error();
else error();
}
}
void ET()// ,
{
E();
while(sym==23)
{
xz;
E();
}
}
void sentence()
{
switch(sym)
{
case 21 :
{
xz;
if(sym==44)//:=
{
xz;
E();}
else error();break;
}
case 1:CS();break;//begin
case 8://if
{
xz;
EB();
if(sym!=5)error();//else
xz;
sentence();break;
}
case 19://while
{
xz;
EB();
if(sym!=4)error();//do
xz;
sentence();
}break;
case 14://read
{
xz;
if(sym!=27) error();//(
xz;
IT();
if(sym!=28)error();//)
xz;break;
}
case 20://write
{
xz;
if(sym!=27) error();//(
xz;
ET();
if(sym!=28)error();//)
xz;break;
}
}
}
int main(int argc, char* argv[])
{
void CS();//end
int chz(char str[15]);//將str1[15]中的字符映射成小寫并判斷是否為str[21][15]中的單詞
int adv();//遞歸
void CT();//else
void E();//+ -
void EB();//< <= > >=
void error();
void ET();//,
void F();//( )
void IT();//非保留詞
void T();// * /
void sentence();//對句子進行語法分析
ch=' ';
fp1=fopen("pas.txt","r");
if(!fp1){printf("cannot open pas.txt!!\n");}
xz;
sentence();
fclose(fp1);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -