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

📄 ll(1)_1.cpp

📁 编译原理的LL(1)分析法的程基本序模版
💻 CPP
字号:
/***********************************************************
*       实验三  LL(1)分析表演示程序模板(教学实验用)
*
*    采用LL(1)表分析法实现表达式文法的语法检验。
*	 (0)E ->TX
*    (1)X ->+TX		(2)X ->-TX		(3)X ->ε
*    (4)T ->FY
*    (5)Y ->*FY		(6)Y ->/FY		(7)F ->ε 
*	 (8)F ->(E)		(9)F ->i
*	 思路:其中i指代数字。先通过词法分析,将实际数字识别
*          用i替代,再进行分析。如
*          3.14*2 =>  i*i
*
*                                 Yao Hong 2008.4.12
************************************************************/

#include <string.h>
#include <stdio.h>

#define MAXPROD		10			//产生式候选数目
#define MAXLLITEM	20			//LL分析表的非空项数

typedef struct Production{
	char LeftCode;				//产生式左部
	char rightCodes[10];		//产生式右部
}Production;

typedef struct LLItem{
   char LeftCode;				//当前非终结符
   char inputCode;				//当前输入
   int Prod;					//产生式编号
}LLItem;

int  stack[200];				//堆栈体
LLItem  LLTable[MAXLLITEM];		//LL分析表
Production prods[MAXPROD];		//产生式集

void init() {
	prods[0].LeftCode='E'; sprintf(prods[0].rightCodes,"%s","TX");
	prods[1].LeftCode='X'; sprintf(prods[1].rightCodes,"%s","+TX");
	prods[2].LeftCode='X'; sprintf(prods[2].rightCodes,"%s","-TX");
	prods[3].LeftCode='X'; sprintf(prods[1].rightCodes,"%s","");
	prods[4].LeftCode='T'; sprintf(prods[2].rightCodes,"%s","FY");
	prods[5].LeftCode='Y'; sprintf(prods[1].rightCodes,"%s","*FY");
	prods[6].LeftCode='Y'; sprintf(prods[2].rightCodes,"%s","/FY");
	prods[7].LeftCode='Y'; sprintf(prods[1].rightCodes,"%s","");
	prods[8].LeftCode='F'; sprintf(prods[2].rightCodes,"%s","(E)");
	prods[9].LeftCode='F'; sprintf(prods[1].rightCodes,"%s","i");

	LLTable[0].LeftCode='E';LLTable[0].inputCode='(';LLTable[0].Prod=0;
	LLTable[1].LeftCode='E';LLTable[1].inputCode='i';LLTable[1].Prod=0;

	LLTable[2].LeftCode='X';LLTable[2].inputCode='+';LLTable[2].Prod=1;
	LLTable[3].LeftCode='X';LLTable[3].inputCode='-';LLTable[3].Prod=2;
	LLTable[4].LeftCode='X';LLTable[4].inputCode=' ';LLTable[4].Prod=3;

	LLTable[5].LeftCode='T';LLTable[3].inputCode='(';LLTable[3].Prod=4;
	LLTable[6].LeftCode='T';LLTable[4].inputCode='i';LLTable[4].Prod=4;

	LLTable[7].LeftCode='Y';LLTable[3].inputCode='*';LLTable[3].Prod=5;
	LLTable[8].LeftCode='Y';LLTable[4].inputCode='/';LLTable[4].Prod=6;
	LLTable[9].LeftCode='Y';LLTable[0].inputCode=' ';LLTable[2].Prod=7;

	LLTable[10].LeftCode='F';LLTable[3].inputCode='(';LLTable[3].Prod=8;
	LLTable[11].LeftCode='F';LLTable[4].inputCode='i';LLTable[4].Prod=9;
}

//堆栈操作
void StackPush(char code) { }

char StackPop() { }

char GetStackTop(){ }

//
bool isDigit(char code){ }

//获取一普通字符
char getChar() { }

//获取一单词(在本文法中只含有一个字符的单词,故还是字符)
char getWord() { }

//查LL分析表
int getLLItem(char input,int code){ }

//输入产生式编号,对栈顶作相应的操作:
//若为非终结符出栈,右边入栈
//若为终结符,比较,相等则继续,不等则出错。
Production nextOperate(int prod){ }

//输入、堆栈操作、输出。
void main() {

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -