• 大小: 124KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-07-28
  • 语言: C/C++
  • 标签: LL1  C++  

资源简介

非常强大而又完整的一个C++程序,包括判断空字符,FIRST,FOLLOW,SELECT集合,短语判断等,备有WORD文档

资源截图

代码片段和文件信息

#include 
#include 
#include  
#include 
using namespace std;

//////////////////////////////////////////////////////////////////////////
//全局变量字典{

int i = 0 j = 0 t = 0 n = 0 m = 0 x = 0 y = 0;  //下标或临时变量
int len = 0;  //字符串长度
int isENum = 0;  //能推出e的终结符数量
bool isE = false; //标记是否能推出e
bool isUpdate = false;  //标记是否更新过结果集
bool isSame = false;  //标记是否有相同SELECT结果集
char strTemp[100] = “\0“;  //临时字符串 或 要分析的字符串
char cTemp = ‘\0‘;  //临时字符

int grammarNum = 0;  //文法数量
char (*grammar)[32];  //文法  grammar[grammarNum][32]
char noEndSign[30];  //非终结符
char endSign[100];  //终结符
char (*grammarTemp)[32];  //临时文法  grammarTemp[grammarNum][32]
char (*isDerivation_e)[2];  //标记非终结符是否推出e数组  isDerivation_e[strlen(noEndSign)][2]
char (*frist)[100];  //每个文法符号的FRIST集  frist[strlen(noEndSign) + strlen(endSign)][100]
char (*bringFrist)[2][100];  //产生式的FRIST集  bringFrist[grammarNum][2][100]
char (*fllow)[100];  //非终结符的FLLOW集  fllow[strlen(noEndSign)][100]
char (*select)[2][100];  //select集  select[grammarNum][2][100]

char construeArray[100];  //分析栈
char bringStr[100];  //推导所用的产生式或匹配字符串
char stepNum[10];  //步聚数
char construeTop = ‘\0‘;  //栈顶字符
char strTempTop = ‘\0‘;  //剩余输入串头字符

//全局变量字典}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
//输入文法
void InputGrammar()
{
//初始数据
do 
{
n = 0;  //标记成功赋值的变量数
fflush(stdin);  //清空输入缓存区
cout<<“请输入产生式数量(1<=n<=20):“;
n = scanf(“%d“ &grammarNum);
} while(!n || grammarNum < 1 || grammarNum > 20);

  grammar = new char[grammarNum][32];

//输入文法字符串
cout<<“\n“<<“文法输入规则如下:\n\na、大写英文字母表示非终结符。\
\nb、e表示空产生式。 \
\nc、除大写字母、#、‘、| 外的单字符表示终结符。\
\nd、不能出现递归文法。(如 S->Sa;)\
\ne、不能出现多余文法规则。(如 S->A,A不是非终结符;程序不检测)\
\nf、文法产生式长度不超过10个字符。(程序不检测)“<<“\n“<
for (i = 0; i < grammarNum; ++i)
{
cout<
//输入文法左部
strTemp[0] = getch();
if ( strTemp[0] >= ‘A‘ && strTemp[0] <= ‘Z‘)
{
grammar[i][0] = strTemp[0];
cout<“;
}
else
{
cout<<“请输入非终结符!“< --i;
continue;
}

//输入文法右部
cin>>strTemp;
for (j = 0; j < strlen(strTemp); ++j)
{
grammar[i][j+1] = strTemp[j];
}
grammar[i][++j] = ‘\0‘;

//检测文法合法性
len = strlen(grammar[i]);
for (j = 1; j < len; ++j)
{
//是否为空串
if (j == 1 && grammar[i][j] == ‘e‘ && grammar[i][j+1] == ‘\0‘)
{
continue;
}

if(grammar[i][j] == ‘#‘ || grammar[i][j] == ‘|‘ || grammar[i][j] == ‘e‘ || grammar[i][j] == ‘\‘‘)
{
cout<<“产生式含有非法字符,请重新输入:“< --i;
break;
}
}

//检测递归产生式
for(j=1; j {
if (grammar[i][0] != grammar[i][1])
{
break;
}
}
if (j == len)
{
cout<<“文法存在递归产生式,请重新输入:“< --i;
}

}

cout<<‘\n‘<
//显示文法
cout<<“你输入的文法是:“<<‘\n‘< for (i = 0; i < grammarNum; ++i)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      27486  2009-06-15 14:33  1061301219-潘鑫涛.cpp

     文件     335360  2009-06-22 12:35  1061301219-潘鑫涛.doc

----------- ---------  ---------- -----  ----

               362846                    2


评论

共有 条评论