📄 program2.cpp
字号:
// Program2.cpp : Defines the entry point for the console application.
//
/* 程序名称:递归下降分析程序设计*/
/*
G[E]:
E→TE′
E′→ATE′|ε
T→FT′
T′→MFT′|ε
F→ (E)|i
A→+|-
M→*|/
*/
#include "stdafx.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
char token[100],in[200];
int i=0;
int n=0;
int flag;
FILE *fp;
void turn();
void E();
void T();
void E_prime();
bool A();
void F();
void T_prime();
bool M();
//文件输入转换为数组
void turn()
{
char ch;
ch =fgetc(fp);
while(ch != EOF)
{
switch(ch)
{
case'\n':break;
case' ':break;
case'\0':break;
default:in[i]=ch;i++;break;
}
ch =fgetc(fp);
}
in[i]='\0';
/*
printf("________________________________转换为数组ok!____________________________\n");
for(m=0;m<=no;m++)
{
printf("%c",in[m]);
}
printf("\n");
printf("__________________________________________________________________________\n");
printf("\n");
printf("\n");
printf("\n");
*/
printf("____________输入串为___________\n");
printf(" ");
for(i=0;in[i]!='\0';i++)
{
if((in[i]=='2' )&& (in[i+1]=='9')) flag=i+5;
}
for(i=flag;in[i]!=';';i++)
{
if((in[i]=='[')&&(in[i+1]=='2')&&(in[i+2]=='1')) {token[n]='+';n++;}
if((in[i]=='[')&&(in[i+1]=='2')&&(in[i+2]=='2')) {token[n]='-';n++;}
if((in[i]=='[')&&(in[i+1]=='2')&&(in[i+2]=='3')) {token[n]='*';n++;}
if((in[i]=='[')&&(in[i+1]=='2')&&(in[i+2]=='5')) {token[n]='(';n++;}
if((in[i]=='[')&&(in[i+1]=='2')&&(in[i+2]=='6')) {token[n]=')';n++;}
if((in[i]=='[')&&(in[i+1]=='3')&&(in[i+2]=='0')) {token[n]='/';n++;}
if((in[i]=='[')&&(in[i+1]=='3')&&(in[i+2]=='7')) {token[n]='i';n++;}
if((in[i]=='[')&&(in[i+1]=='3')&&(in[i+2]=='8')) {token[n]='i';n++;}
}
token[n]='#';
for(i=0;i<=n;i++)
{
printf("%c",token[i]);
}
printf("\n");
i=0;
flag=0;
}
//进行分析
bool match(char ch)
{
if(token[i] == ch) return true;
else return false;
}
void advance()
{
i++;
}
void E() //E→TE′
{
T();
E_prime();
}
void T() //T→FT′
{
F();
T_prime();
}
void E_prime()//E′→ATE′|ε
{
if(A())
{
T();
E_prime();
}
else
if(match(')')||match('#')) return;
else {flag=1;}
}
bool A()//A→+|-
{
if(match('+')||match('-')) {advance();return true;}
else
{
return false;
}
}
void F()//F→ (E)|i
{
if(match('('))
{
advance();
E();
if(match(')'))
advance();
}
else
if(match('i')) {advance(); }
else {flag=1;}
}
void T_prime() //T′→MFT′|ε
{
if(M())
{
F();
T_prime();
}
else
if(match('+')||match(')')||match('#')) return;
else {flag=1;}
}
bool M()//M→*|/
{
if(match('*')||match('/')) {advance();return true;}
else {return false;}
}
int main(int argc, char* argv[])
{
fp=fopen("test.txt", "r");
turn();
E();
if(flag == 1) printf(" 输入串不合法!\n");
else printf(" 输入串合法!\n");
printf("_______________________________\n");
fclose(fp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -