词法分析程序

词法分析程序流程图

#include

#include

//#include

charprog[80],token[8];

charch;

int c=21;

intsyn,p,m=0,n,row,sum=0;

char *rwtab[6]={"begin","if","then","while","do","end"};

#define MAX 200

void getbc()//每次调用时,检查ch中的字符是否为空白字符,若是空白字符,取下一个字符,直至ch中进入一个非空白字符为止。

{

while(ch==' ')

{

ch = prog[p++];

}

}

int letter(char ch)

{

if((ch>='a'&&ch='A'&&ch

return 1;

else

return 0;

}

int digit(char ch)

{

if(ch>='0'&&ch

return 1;

else

return 0;

}

void concat()//每次调用把当前ch中的字符与token中的字符串联接。例如,假定token字符数组中原有值为“ab”, ch中存放着“c”,经调用concat( )后,token数组中的值变为“abc”。 {

token[m++]=ch;

// token[m]='\0';

}

int reserve()//对token中的字符串查关键字表,若它是一个关键字, 则回送它的编码,否则回送标识符的种别码10。

{

for(n=0;n

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

return n;

}

void retract()//读字符指针回退一个字符。

{

p--;

}

void dtb() //+进制转换函数, 它将token中的数字串转换成十进制数值表示

{

sum=0;

while(digit(ch))

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

}

voidScaner()

{ for(n=0;n

ch = prog[p++];

getbc();

if(letter(ch))

{

m=0;

while(letter(ch) || digit(ch))

{ concat();

ch=prog[p++];

}

token[m++]='\0';

retract();

c=reserve( );

if(c!=21) syn=c;

else syn=21;

}

else if(digit(ch))

{

/* while(digit(ch))

{

concat();

ch=prog[p++];

}

token[m++]='\0';

sum=0;

while((ch>='0'&&ch

{

sum=sum*10+ch-'0';

ch=prog[p++];

}*/

dtb();

syn = 22;

retract();

}

else switch(ch)

{

case'+':token[0]=ch;syn=34; break ; case'-':token[0]=ch;syn=35; break ;

case'*':token[0]=ch;syn=36; break ;

case'/':token[0]=ch;syn=37; break ;

case'

if(ch=='=')

{

token[m++]=ch; syn = 42;

}

else if(ch== '>') {token[m++]=ch; syn =41;}

else {

retract();syn = 43;

}

break;

case':': m=0;token[m++]=ch;ch=prog[p++];

if(ch== '=')

{

token[m++]=ch;syn=44;

}

else{

retract(); syn = 45;

}

break;

case'>':m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=43;

token[m++]=ch;

}

else

{

syn=40;

retract();

}

break;

case';': syn = 24;token[0]=ch; break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

case'\n':syn=-2;break;

default: syn = -1; break;

}

}

void run()

{

p=0;

row=1;

do

{

Scaner();

switch(syn)

{

case 22: printf("(%d,%d)\n",syn,sum); break; case -1: printf("Error in row %d\n",row); break; case -2: row=row++;break;

default: printf("(%d,%s)\n",syn,token);break; }

}

while (syn!=0);

}

int main()

{

int flag;

char buf[4096]; /*缓冲区*/ FILE *fp; /*文件指针*/ intlen,i; /*行字符个数*/ char address[100]; printf("键盘输入选择1\n"); printf("文件输入选择2\n"); scanf("%d",&flag); if(flag==1) { printf("Please input string:\n"); p=0; do { scanf("%c",&ch); prog[p++]=ch; } while(ch!='#'); run(); } else if(flag==2) { printf("请输入源文件名(包括路径和后缀名)\n"); scanf("%s",&address); if((fp=fopen(address,"r"))==NULL) { perror("fail to read"); return -1; } int line=0; while(fgets(buf,4096,fp) != NULL)

} } else { { len = strlen(buf); // buf[len-1] = '\0'; /*去掉换行符*/ printf("第%d行 %s\n",++line,buf); for(i=0;i

词法分析程序流程图

#include

#include

//#include

charprog[80],token[8];

charch;

int c=21;

intsyn,p,m=0,n,row,sum=0;

char *rwtab[6]={"begin","if","then","while","do","end"};

#define MAX 200

void getbc()//每次调用时,检查ch中的字符是否为空白字符,若是空白字符,取下一个字符,直至ch中进入一个非空白字符为止。

{

while(ch==' ')

{

ch = prog[p++];

}

}

int letter(char ch)

{

if((ch>='a'&&ch='A'&&ch

return 1;

else

return 0;

}

int digit(char ch)

{

if(ch>='0'&&ch

return 1;

else

return 0;

}

void concat()//每次调用把当前ch中的字符与token中的字符串联接。例如,假定token字符数组中原有值为“ab”, ch中存放着“c”,经调用concat( )后,token数组中的值变为“abc”。 {

token[m++]=ch;

// token[m]='\0';

}

int reserve()//对token中的字符串查关键字表,若它是一个关键字, 则回送它的编码,否则回送标识符的种别码10。

{

for(n=0;n

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

return n;

}

void retract()//读字符指针回退一个字符。

{

p--;

}

void dtb() //+进制转换函数, 它将token中的数字串转换成十进制数值表示

{

sum=0;

while(digit(ch))

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

}

voidScaner()

{ for(n=0;n

ch = prog[p++];

getbc();

if(letter(ch))

{

m=0;

while(letter(ch) || digit(ch))

{ concat();

ch=prog[p++];

}

token[m++]='\0';

retract();

c=reserve( );

if(c!=21) syn=c;

else syn=21;

}

else if(digit(ch))

{

/* while(digit(ch))

{

concat();

ch=prog[p++];

}

token[m++]='\0';

sum=0;

while((ch>='0'&&ch

{

sum=sum*10+ch-'0';

ch=prog[p++];

}*/

dtb();

syn = 22;

retract();

}

else switch(ch)

{

case'+':token[0]=ch;syn=34; break ; case'-':token[0]=ch;syn=35; break ;

case'*':token[0]=ch;syn=36; break ;

case'/':token[0]=ch;syn=37; break ;

case'

if(ch=='=')

{

token[m++]=ch; syn = 42;

}

else if(ch== '>') {token[m++]=ch; syn =41;}

else {

retract();syn = 43;

}

break;

case':': m=0;token[m++]=ch;ch=prog[p++];

if(ch== '=')

{

token[m++]=ch;syn=44;

}

else{

retract(); syn = 45;

}

break;

case'>':m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=43;

token[m++]=ch;

}

else

{

syn=40;

retract();

}

break;

case';': syn = 24;token[0]=ch; break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

case'\n':syn=-2;break;

default: syn = -1; break;

}

}

void run()

{

p=0;

row=1;

do

{

Scaner();

switch(syn)

{

case 22: printf("(%d,%d)\n",syn,sum); break; case -1: printf("Error in row %d\n",row); break; case -2: row=row++;break;

default: printf("(%d,%s)\n",syn,token);break; }

}

while (syn!=0);

}

int main()

{

int flag;

char buf[4096]; /*缓冲区*/ FILE *fp; /*文件指针*/ intlen,i; /*行字符个数*/ char address[100]; printf("键盘输入选择1\n"); printf("文件输入选择2\n"); scanf("%d",&flag); if(flag==1) { printf("Please input string:\n"); p=0; do { scanf("%c",&ch); prog[p++]=ch; } while(ch!='#'); run(); } else if(flag==2) { printf("请输入源文件名(包括路径和后缀名)\n"); scanf("%s",&address); if((fp=fopen(address,"r"))==NULL) { perror("fail to read"); return -1; } int line=0; while(fgets(buf,4096,fp) != NULL)

} } else { { len = strlen(buf); // buf[len-1] = '\0'; /*去掉换行符*/ printf("第%d行 %s\n",++line,buf); for(i=0;i


相关文章

  • 语法分析程序的设计与实现
  • 语法分析程序的设计与实现 一:实验内容: ................................................................................................... ...查看


  • 编译原理上机报告
  • 编译原理上机报告 组员: 班级: 一.上机题目: 实现一个简单的语言(Core Programming Language,CPL )的编译器(解释器) (或者其他自己想完成的编译器) 二.上机目的 加深编译原理基础知识的理解:词法分析.语法 ...查看


  • 编译原理上机实验
  • 实验1简单的词法分析子程序 [实验目的] ● 理解词法分析在编译程序中的作用 ● 初步了解和掌握词法分析程序的实现方法和技术 [实验内容] 1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量. 2. 无符号数的算术四则 ...查看


  • 脚本语言词法分析器的状态转移图构造
  • 型查量直旦鲨坌堑登丝丛查整整笪丝垄2箜 脚本诰百词法分机器的状态转移图构造木 韩江洪张亚琼魏正佳 合肥J:业人学计算机与信息学院,安徽合肥230009 '摘要:脚本语言词法.'语法规则简单,具有明确的界定符,为了简化其词法语法分析过程,提出 ...查看


  • C语言实现词法分析程序设计参考
  • 词法分析 一.实验目的 设计.编制并调试一个词法分析程序,加深对词法分析原理的理解. 二.实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写. (2)运算符和界符 ...查看


  • 词法分析实验报告 1
  • 实验一 词法分析 一.实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的 ...查看


  • 词法分析器_实验报告 1
  • 词法分析器实验报告 实验目的: 设计.编制.调试一个词法分析子程序-识别单词,加深对词法分析原理的理解. 实验要求: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字.标识符.常数.运算符.分界符 ...查看


  • 高级语言编译过程可视化研究
  • 高级语言编译过程可视化研究 摘要:针对编译原理教学中存在的知识点多.概念抽象.算法难 于理解的情况,本文设计了一种可视化编译系统,实现了类c 语言 的文法编辑与检查.词法分析.语法分析.语义处理的过程展示. 系统界面布局一致.操作简便,为便 ...查看


  • 软件编译技术课程总结
  • 软件编译技术论文 学号: 姓名: 班级: 摘要 软件编译技术是计算机及相关专业的一门重要专业课程,在计算机科学中有很重要的地位和作用,已被国内外高校列为计算机专业的主要课程.它主要介绍了高级程序设计语言编译程序构造的一般原理.基本设计方法. ...查看


  • 编译原理实验指导书---2014年修订版
  • 编译原理实验指导 石家庄经济学院信息工程学院 2014-01-25 "编译原理"是计算机类专业一门理论性和实践性强的专业课程,在本专业的课程体系中处于十分重要的地位,属于必修课.本课程的内容主要介绍高级程序设计语言实现的 ...查看


热门内容