求编译原理词法分析程序

lovekxh223 2010-05-26 10:35:11
完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。
<标识符>→字母︱ <标识符>字母︱ <标识符>数字
<无符号整数>→数字︱ <无符号整数>数字
<单字符分界符> →+ ︱- ︱* ︱; ︱(︱)
<双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>* <小于>→< <等于>→= <大于>→> <冒号> →: <斜竖> →/
该语言的保留字 :begin end if then else for do while and or not
[设计说明] (1)该语言大小写不敏感;(2)字母为a-z A-Z,数字为0-9;(3)可以对上述文法进行扩充和改造;(4) ‘/*……*/’为程序的注释部分。

要求用C语言编写,哪位大哥帮忙下啊
...全文
779 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
viktor 2012-03-09
  • 打赏
  • 举报
回复
楼主可以试一下Flex。让他自动生成。
zhangfan262 2012-03-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
int getch();
//void exit();
main()
{p=0;
printf("\n please input a string(end with '#'):/n");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn);
break;
case -1:printf("you have input a wrong string\n");
getch();
// exit(0);
default: printf("( %-10s%5d )\n",token,syn);
break;
}
}while(syn!=0);
getch();
return 0;
}
int getch()
{
return 0;
}
void scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch==' ')||(ch=='\n'))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;
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 '<':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
p--;
}
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
p--;
}
break;
case '+': token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{ syn=17;
token[m++]=ch;
}
else
{ syn=13;
p--;
}
break;

case '-':token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{ syn=29;
token[m++]=ch;
}
else
{ syn=14;
p--;
}
break;

case '!':ch=prog[p++];
if(ch=='=')
{ syn=21;
token[m++]=ch;
}
else
{ syn=31;
p--;
}
break;

case '=':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=25;
token[m++]=ch;
}
else
{ syn=18;
p--;
}
break;
case '*': syn=15;
token[m++]=ch;
break;
case '/': syn=16;
token[m++]=ch;
break;
case '(': syn=27;
token[m++]=ch;
break;
case ')': syn=28;
token[m++]=ch;
break;
case '{': syn=5;
token[m++]=ch;
break;
case '}': syn=6;
token[m++]=ch;
break;
case ';': syn=26;
token[m++]=ch;
break;
case '\"': syn=30;
token[m++]=ch;
break;
case '#': syn=0;
token[m++]=ch;
break;
case ':':syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]='\0';
}
zhangfan262 2012-03-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
int getch();
//void exit();
main()
{p=0;
printf("\n please input a string(end with '#'):/n");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn);
break;
case -1:printf("you have input a wrong string\n");
getch();
// exit(0);
default: printf("( %-10s%5d )\n",token,syn);
break;
}
}while(syn!=0);
getch();
return 0;
}
int getch()
{
return 0;
}
void scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch==' ')||(ch=='\n'))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;
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 '<':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
p--;
}
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
p--;
}
break;
case '+': token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{ syn=17;
token[m++]=ch;
}
else
{ syn=13;
p--;
}
break;

case '-':token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{ syn=29;
token[m++]=ch;
}
else
{ syn=14;
p--;
}
break;

case '!':ch=prog[p++];
if(ch=='=')
{ syn=21;
token[m++]=ch;
}
else
{ syn=31;
p--;
}
break;

case '=':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=25;
token[m++]=ch;
}
else
{ syn=18;
p--;
}
break;
case '*': syn=15;
token[m++]=ch;
break;
case '/': syn=16;
token[m++]=ch;
break;
case '(': syn=27;
token[m++]=ch;
break;
case ')': syn=28;
token[m++]=ch;
break;
case '{': syn=5;
token[m++]=ch;
break;
case '}': syn=6;
token[m++]=ch;
break;
case ';': syn=26;
token[m++]=ch;
break;
case '\"': syn=30;
token[m++]=ch;
break;
case '#': syn=0;
token[m++]=ch;
break;
case ':':syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]='\0';
}
AlanBruce 2010-05-28
  • 打赏
  • 举报
回复
UP

UP

lovekxh223 2010-05-28
  • 打赏
  • 举报
回复
如果会就不会提问了。。。。看书上也不懂啊
fthislife 2010-05-28
  • 打赏
  • 举报
回复
mark
Walf_ghoul 2010-05-28
  • 打赏
  • 举报
回复
lex and yacc
qq752319797 2010-05-26
  • 打赏
  • 举报
回复
麻烦大哥大姐们在给解释清楚点行吗?我是个菜鸟
bobo364 2010-05-26
  • 打赏
  • 举报
回复
楼主参考一下
#include   <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LEN sizeof(struct Node)
#define NULL 0

struct Node
{char data;
struct Node *next; /* 定义动态链表数据结构 */
};


void output(struct Node*);/*扫描输出函数*/
void scaner(); /*词法分析*/
void getbc();
void getch();
void concat();
int letter(char ch);
int degit(char ch);
int reserve();
void retract();
void back(int a,char *b);

struct Node *head,*p;
char ch; /*全局变量*/
char *key[]={ "main ", "int ", "char ", "if ", "else ", "for ", "while "}; /*关键字表*/
char token[20]; /*字符数组,存放构成单词的符号串*/

int main(void)
{
head=(struct Node *)malloc(LEN); /*分配头节点存储空间*/
if(!head) {printf( "error ");exit(1);}
head-> next=NULL;
head-> data= ' ';
p=head;
printf( "When input a \ '$\ ' at the beigining of an line,this programe will be over.\n ");
printf( "And the programe will output the codes you inputed just now.\n ");
printf( "Please input your codes:\n ");

while(1)
{ int i=0;
char temp[256];/*每行长度不超过256个字符*/
gets(temp); /*输入源程序,以行为单位*/
if(temp[0]== '$ ') break;/*当输入的第一个字符为$时表示输入源代码结束*/

p-> next=(struct Node *)malloc(LEN);
if(!(head-> next)) {printf( "error ");exit(1);}
p=p-> next;

while(temp[i]!= '\0 ' && i <256) /*将输入的代码以行为单位存入缓冲区*/
{
p-> data=temp[i];
p-> next=(struct Node *)malloc(LEN);
if(!(p-> next)) {printf( "error ");exit(1);}
p=p-> next;
i++;
}
p-> data= '\n ';
p-> next=NULL; /*尾结点*/
}

output(head); /*扫描缓冲区,输出结果*/
p=head-> next;
while(p-> next!=NULL)
scaner(); /*词法分析*/

system( "pause ");
return 0;
}

void output(struct Node *head) /*扫描缓冲区函数*/
{ if(!head) {printf( "error ");exit(1);}
p=head-> next;
while(p-> next!=NULL)
{
printf( "%c ",p-> data);
p=p-> next;
}
printf( "\n ");
}

void getbc() /*若ch中是空白字符,则不停调用getch()直到读入的不是空白字符为止*/
{
while (ch== ' ')
getch();
}

void getch() /*从缓冲区读入一字符*/
{
ch=p-> data;
p=p-> next;
}

void concat() /*将ch中的字符连接到token的后面*/
{
unsigned int i;
i=strlen(token);
token[i]=ch;
token[i+1]= '\0 ';
}

int letter(char ch) /*判断ch中的是否是字母*/
{
return isalpha((int)ch);
}

int digit(char ch) /*判断ch中的是否是数字*/
{
return isdigit((int)ch);
}

int reserve() /*判断token中的字符串是否是关键字或是标识符*/
{
int k;
for(k=0;k <6;k++)
{
if(strcmp(key[k],token)==0) return (k+1);
}
return 10;
}

void retract() /*指针回退一个字符*/
{
struct Node *Q;
Q=head-> next;
while(Q-> next!=p)
Q=Q-> next;
p=Q;
}

void back(int a,char *b) /*返回函数,输出序列*/
{
printf( "(%d,%s) ",a,b);
}


void scaner() /*词法分析函数*/
{
int c;
token[0]=NULL; /*将token清空*/
getch();
getbc(); /*读入一个单词*/
if(letter(ch)) /*处理字符的情况*/
{
while(letter(ch)||digit(ch))
{
concat();
getch();
}
retract();
c=reserve();
if(c!=10) back(c,token);
else back(10,token);
}
else if(digit(ch)) /*处理数字的情况*/
{
while(digit(ch))
{
concat();
getch();
}
retract();
printf( "(20,%d) ",atoi(token));
}
else
switch(ch) /*处理特殊符号的情况*/
{
case '+ ': back(22, "+ ");break;
case '- ': back(23, "- ");break;
case '* ': back(24, "* ");break;
case '/ ': back(25, "/ ");break;
case ' < ': getch();
if(ch== '= ') back(38, " <= ");
retract();
back(36, " < ");
break;
case '> ': getch();
if(ch== '= ') back(37, "> = ");
retract();
back(35, "> ");
break;
case '; ': back(34, "; ");break;
case '{ ': back(30, "{ ");break;
case '} ': back(31, "} ");break;
case '( ': back(26, "( ");break;
case ') ': back(27, ") ");break;
case '= ': back(21, "= ");break;
case '\n ': break;
default: printf( "error ");break;
}
}
huanmie_09 2010-05-26
  • 打赏
  • 举报
回复
gbb21 2010-05-26
  • 打赏
  • 举报
回复
homework!!!
东莞某某某 2010-05-26
  • 打赏
  • 举报
回复
教材上都应该有自动机吧 ?
算法流程有了,该自己动手写了
lirg8405 2010-05-26
  • 打赏
  • 举报
回复
嘻嘻,我不会
lovekxh223 2010-05-26
  • 打赏
  • 举报
回复
坐等高人解答
赵4老师 2010-05-26
  • 打赏
  • 举报
回复
AAA20090987 2010-05-26
  • 打赏
  • 举报
回复
帮顶。。。。。。
soulzbg 2010-05-26
  • 打赏
  • 举报
回复
帮顶一下
cattycat 2010-05-26
  • 打赏
  • 举报
回复
找源码自己分析吧,书上讲的是原理。
localxiao 2010-05-26
  • 打赏
  • 举报
回复
YACC

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧