📄 ll(1)_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 + -