词法与文法分析程序

1.词法与文法分析程序功能:   主要语句:begin<语句串>end

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“成功”,否则输出“错误”。

2.符号与种别码对照表:


单词符号


种别码


单词符号


种别码


begin


1


:


17


if


2


:=


18


then


3


<


20


while


4


<=


21


do


5


<>


22


end


6


>


23


l(l|d)*


10


>=


24


dd*


11


=


25


+


13


;


26


-


14


(


27


*


15


)


28


/


16


#


0

3.文法描述词法规则:

源程序及运行结果:

#include <stdio.h>
#include <string.h>
char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum;
int kk;

void factor(void);
void expression(void);
void yucu(void);
void term(void);
void statement(void);
void lrparser(void);
void scaner(void);

int main(void)
{
p=kk=0;
printf("\n请输入一串字符串,以#结束: \n");

do
{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=‘#‘);

p=0;
scaner();
lrparser();
//getch();用户获得字符串
}

void lrparser(void)
{
if(syn==1)
{
scaner(); /*读下一个单词符号*/
yucu(); /*调用yucu()函数;*/

if(syn==6)
{
scaner();
if((syn==0)&&(kk==0))
printf("成功!\n");
}
else
{
if(kk!=1) printf("这条字符串无法结束!\n");
kk=1;
}
}
else
{
printf("无法开始!\n");
kk=1;
}

return;
}

void yucu(void)
{
statement(); /*调用函数statement();*/

while(syn==26)
{
scaner(); /*读下一个单词符号*/
if(syn!=6)
statement(); /*调用函数statement();*/
}

return;
}

void statement(void)
{
if(syn==10)
{
scaner(); /*读下一个单词符号*/
if(syn==18)
{
scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/
}
else
{
printf("符号 ‘:=‘ 是错的!\n");
kk=1;
}
}
else
{
printf("错误的句子!\n");
kk=1;
}

return;
}

void expression(void)
{
term();

while((syn==13)||(syn==14))
{
scaner(); /*读下一个单词符号*/
term(); /*调用函数term();*/
}

return;
}

void term(void)
{
factor();

while((syn==15)||(syn==16))
{
scaner(); /*读下一个单词符号*/
factor(); /*调用函数factor(); */
}

return;
}

void factor(void)
{
if((syn==10)||(syn==11))
{
scaner();
}
else if(syn==27)
{
scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/

if(syn==28)
{
scaner(); /*读下一个单词符号*/
}
else
{
printf("错误在‘(‘\n");
kk=1;
}
}
else
{
printf("句子语法错误!\n");
kk=1;
}

return;
}
void scaner(void)
{
sum=0;

for(m=0;m<8;m++)
token[m++]=NULL;

m=0;
ch=prog[p++];

while(ch==‘ ‘)
ch=prog[p++];

if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{
while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]=‘\0‘;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>=‘0‘)&&(ch<=‘9‘))
{
while((ch>=‘0‘)&&(ch<=‘9‘))
{
sum=sum*10+ch-‘0‘;
ch=prog[p++];
}
p--;
syn=11;
}
else
switch(ch)
{
case ‘<‘:
m=0;
ch=prog[p++];
if(ch==‘>‘)
{
syn=21;
}
else if(ch==‘=‘)
{
syn=22;
}
else
{
syn=20;
p--;
}
break;

case ‘>‘:
m=0;
ch=prog[p++];
if(ch==‘=‘)
{
syn=24;
}
else
{
syn=23;
p--;
}
break;

case ‘:‘:
m=0;
ch=prog[p++];
if(ch==‘=‘)
{
syn=18;
}
else
{
syn=17;
p--;
}
break;

case ‘+‘:
syn=13;
break;

case ‘-‘:
syn=14;
break;

case ‘*‘:
syn=15;
break;

case ‘/‘:
syn=16;
break;

case ‘(‘:
syn=27;
break;

case ‘)‘:
syn=28;
break;

case ‘=‘:
syn=25;
break;

case ‘;‘:
syn=26;
break;

case ‘#‘:
syn=0;
break;

default:
syn=-1;
break;
}
}

时间: 2024-10-13 10:36:32

词法与文法分析程序的相关文章

递归下降分析程序

一.      实验目的 编制一个递归下降分析程序 LL(1)文法: E->TE1 E1->+TE1|-TE1|∑ T->FT1; T1->*FT1|/FT1|∑ F->(E)|i|1 二.      实验内容和要求 输入:LL(1)文法 判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理. 每遇到一个非终结符,则调用相应的分析子程序 一.      实验方法.步骤及结果测试   1.   源程序名

递归下降分析程序报告

实验一.递归下降分析程序实验 专业 商业软件工程   姓名 姓名 学号 201506110148 一.        实验目的   编译递归下降分析程序识别c语言文法 二.        实验内容和要求 简单写出c语言文法 分析c语言文法是否为LL1文法,若不是,修改成LL1文法. 编写程序实现对c语言LL1文法判断是否有语法错误 三.        实验方法.步骤及结果测试  1.      源程序名:递归下降分析程序 源程序名递归下降分析程序.c 可执行程序名:递归下降分析程序.exe 2.

实验三、&#160;递归下降分析程序实验

实验三. 递归下降分析程序实验 专业 软件工程   姓名 麦振澎 学号 201506110162 一.        实验目的           通过设计,编制,调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二.        实验内容和要求 输入:源程序字符串 输出:正确或者错误 三.        实验方法.步骤及结果测试             1.      源程序名: 递归下降语法分析程序.c       2.      原理分析及流程图

用JAVA实现LL(1)文法语法分析程序

一个简单语法分析器的设计与实现 实验目的: 1.掌握语法分析的基本任务: 2.掌握语法分析器的工作流程: 3.能设计一个简单的语法分析器,并完成对指定句子的分析. 实验内容: 给定一个LL(1)文法,编制语法分析程序,输出其预测分析表,用LL(1)预测分析程序实现其分析过程并输出分析过程和分析结果. 主要实验内容: 求出预测分析表,需要求解此文法的select集:而select集是由first集和follow集求解出来的.所以一般是先求出first集,再求出follow集,再最后求出select

从阅读Discuz的核心代码并给出注释的经历分析程序员该如何阅读代码?

本文标签:   程序员 php Discuz的核心代码 框架 深度学习框架 阅读优秀的代码,是技术水平成长的最佳途径.记得每个进来的新人,我都做过阅读优秀代码的要求,但几乎都只能坚持很少一段时间而已. 前晚大家还在开玩笑的讨论,都是因为看了前人的一些写法,才学会了一些乱七八糟的花招. 晚上我又开始重新阅读Discuz的核心代码,花了1h多的时间,才完成一个core文件的注释. 注释后的代码: <?php /** * [Discuz!] (C)2001-2099 Comsenz Inc. * Th

google perftools分析程序性能

Google perftools 1.功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目了然.在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的. 2.安装 1.下载gperftools Wget https://code.google.com/p/gperftools/downl

实验三 递归下降分析程序实验

一.        实验目的      编制一个递归下降分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试    1.    源程序名:递归下降分析程序.c 可执行程序名:递归下降分析程序.exe   2. 3.主要程序段及其解释: #include<stdio.h> #include<string> char str[50]; int index=0; void E(); //E->TX;

如何分析程序的时间消耗

总结一些常用的方法,思考如何分析一个程序的时间消耗. 1.  Trace Log 这个是大家最常用,也是最简单和有效地方法.通常是在函数的开始和结束的位置加入Log, 最后通过Log记录时间统计函数的时间消耗. 有时嫌2次log太麻烦,我们可以通过RAII进行封装: class CTimeCostDebug{public: CTimeCostDebug(LPCTSTR lpszFunName); ~CTimeCostDebug()}; 我们在构造函数里记录开始时间,在析构函数里记录结束时间以及打

个人分析程序员的性格特点,生活习惯

 身为程序员的您是否有下面这么多性格与习惯? 1.聪明但是给人的感觉是不谦逊. 2.交流与合作能力比较强,但是又往往向往个人主义! 3.懒惰,大部分程序员可能都是这样,也许是因为程序员已经习惯了脑力劳动. 4.创造力非常强,但是好像又缺乏纪律性! 5.学习能力非常强,但是又往往太过于依赖个人经验. 从我个人就暂时归纳这么多,请大家继续跟帖总结... 个人分析程序员的性格特点,生活习惯