⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program2.cpp

📁 完成算术表达式的LL(1)文法的递归下降分析的程序
💻 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 + -