文档介绍:
(1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止;
(2)输入已知文法,由程序自动生成它的LL(1)分析表;
(3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。
2.分析
该程序可分为如下几步:
(1)读入文法
(2)判断正误
(3)若无误,判断是否为LL(1)文法
(4)若是,构造分析表;
(5)由总控算法判断输入符号串是否为该文法的句型。
有效?
读入文法
开始
3.流程图
是
是LL(1)文法?
结束
报错
判断句型
ﻩ是
/*******************************************
语法分析程序
作者:龚勋 刘栋 罗晓波
学号:2 2 2
计科系 13班
********************************************/
#include<stdlib.h>
#include<stdio.h>
#include<string。h>
/*******************************************/
int count=0; /*分解的产生式的个数*/
int number; /*所有终结符和非终结符的总数*/
char start; /*开始符号*/
char termin[50]; /*终结符号*/
char non_ter[50]; /*非终结符号*/
char v[50]; /*所有符号*/
char left[50]; /*左部*/
char right[50][50]; /*右部*/
char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/
char first1[50][50]; /*所有单个符号的FIRST集合*/
char select[50][50]; /*各单个产生式的SELECT集合*/
char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/
char empty[20]; /*记录可直接推出^的符号*/
char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/
int validity=1; /*表示输入文法是否有效*/
int ll=1; /*表示输入文法是否为LL(1)文法*/
int M[20][20]; /*分析表*/
char choose; /*用户输入时使用*/
char empt[20]; /*求_emp()时使用*/
char fo[20]; /*求FOLLOW集合时使用*/
/*******************************************
判断一个字符是否在指定字符串中
********************************************/
int in(char c,char *p)
{
ﻩint i;
if(strlen(p)==0)
ﻩ return(0);
ﻩfor(i=0;;i++)
{ﻩ
ﻩ if(p[i]==c)
ﻩreturn(1); /*若在,返回1*/
ﻩif(i==strlen(p))
return(0); /*若不在,返回0*/
ﻩ}
}
/*******************************************
得到一个不是非终结符的符号
********************************************/
char c()
{
ﻩchar c='A’;
while(in(c,non_ter)==1)
c++;
return(c);
}
/****************************************