c语言实现一个简单的语法分析器

更新时间:2023-07-04 14:11:00 阅读: 评论:0

c语⾔实现⼀个简单的语法分析器
⼀、前⾔
接着上次的词法分析器,这次是语法分析器;
简单来讲,语法分析器要实现的功能就是分析⼀个程序段是否是合法的,依据就是⽂法;我们依旧采取词法分析器的littleP⽂法来分析。⼤型的语法分析器,都是会提⽰多处错误,我就只实现了遇到⼀处错误就报错的策略,这样更加容易⼀些;小米粥煮多久
⼆、源代码以及注释:
/*
待分析的简单语⾔的语法
⽤扩充的BNF表⽰如下:
⑴<;程序>::=begin<;语句串>end
⑵<;语句串>::=<;语句>{;<;语句>}
⑶<;语句>::=<;赋值语句>
⑷<;赋值语句>::=ID:=<;表达式>
⑸<;表达式>::=<;项>{+<;项> | -<;项>}
⑹<;项>::=<;因⼦>{*<;因⼦> | /<;因⼦>
⑺<;因⼦>::=ID | NUM | (<;表达式>)
*/
#include "stdio.h"
#include "string.h"
char prog[100],token[8],ch;//prog[100],⽤来存储要处理的对象,token⽤来与关键字⽐较,ch⽤来存储⼀个字符
char *rwtab[6]={"begin","if","then","while","do","end"};//关键字表
int syn,p,m,n,sum;
/*syn是种别码,p为prog数组的指针,m为token数组的指针,n为rwtab数组的指针,sum为词法分析器⾥的数字数值⼤⼩*/
int flag;//flag与判断是否end有关
void factor(void);//因式 factor
void expression(void);//表达式 expression
void yucu(void);
void term(void);//项 term
void statement(void);// 语句 statement
void parr(void);
void scaner(void);//扫描器
int main(void)
{
p=flag=0;
printf("\nplea input a string (end with '#'): \n");
/*从命令⾏读取要处理的对象,并存储在prog[]数组中*/
do
{
scanf("%c",&ch);
//printf("\n input %c now\n",ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();//主要完成赋值种别码等词法分析功能
parr();//调⽤各种递归⼦程序,完成语法分析的过程
//getch();
}
/*调⽤各种递归⼦程序,完成语法分析的过程*/
void parr(void)
{
if(syn==1)//begin
scaner();      /*读下⼀个单词符号*/
yucu();        /*调⽤yucu()函数;*/
if(syn==6)//end
{
scaner();
if((syn==0)&&(flag==0))//出现#且flag=0
printf("success!\n");
}
el
{
if(flag!=1) printf("the string haven't got a 'end'!\n");//flag来判断是否end    flag=1;
}
}
白唇竹叶青
el
{
printf("haven't got a 'begin'!\n");
flag=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();      /*调⽤函数expression();*/
}
el
{
printf("the sing ':=' is wrong!\n");
flag=1;
}
}
el
中读{
printf("wrong ntence!\n");
flag=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();
试试看
}
el if(syn==27)//开头是左括号(
{
scaner();          /*读下⼀个单词符号*/
expression();        /*调⽤函数statement();*/
if(syn==28)//出现右括号)
{
scaner();          /*读下⼀个单词符号*/
}
el
{
printf("the error on '('\n");
flag=1;
}
}
el
{
printf("the expression error!\n");
flag=1;
}
return;
}
/*主要完成赋值种别码等词法分析功能*/
void scaner(void)//扫描器,词法分析器内容{
sum=0;//数字初始化为0
for(m=0;m<8;m++)//初始化token
token[m++]=NULL;
m=0;//m为token的指针
ch=prog[p++];//数组指针+1
while(ch==' ')//遇到空格+1
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+1,下次循环使⽤
因为你英文
}
p--;//循环跳出,要-1
syn=10;//10,字母开头
token[m++]='\0';//\0为字符串结束符
/*判别是否为关键字*/
for(n=0;n<6;n++)//n为rwtab的指针
if(strcmp(token,rwtab[n])==0)//strcmp返回值为0,则两个参数⼤⼩相同
{
syn=n+1;
break;
}
}
el if((ch>='0')&&(ch<='9'))//遇到数字
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;//回溯
syn=11;//11为数字
}
/
*除数字和字母开头以外的其他符号*/
el
switch(ch)
{
ca '<':
m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
el if(ch=='=')
{
syn=22;
}
el
{
syn=20;
p--;//回溯
}
break;
ca '>':
m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
el
{
syn=23;
p--;
}
break;
ca ':':
m=0;
ch=prog[p++];  if(ch=='=')
{
syn=18;
}
el
{
syn=17;
p--;
}
break;
ca '+':
syn=13;
break;
ca '-':
syn=14;
break;
ca '*':对联格式
syn=15;
break;
ca '/':
syn=16;
break;
ca '(':
syn=27;
break;
ca ')':
syn=28;
break;
ca '=':
syn=25;
break;
ca ';':
syn=26;
break;
ca '#':
syn=0;
break;
default:
syn=-1;
break;未来小七
}
}
>小学生简单手工

本文发布于:2023-07-04 14:11:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1078027.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:词法   完成   分析   分析器   是否   数字
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图