C语言实现词法分析程序设计参考

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end 所有的关键字都是小写。 (2)运算符和界符

: = + - * / > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码;

token为存放的单词自身字符串; sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的算法思想:

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};

图1-1

(2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想:

首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。

图 1-2

四、词法分析程序的C语言程序源代码:

#include #include

char prog[80],token[8],ch; int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"}; scaner(); 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(); }

scaner() { sum=0;

for(m=0;m

while((ch==' ')||(ch=='\n'))ch=prog[p++];

if(((ch='a'))||((ch='A')))

{ while(((ch='a'))||((ch='A'))||((ch>='0')&&(ch

for(n=0;n

if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } }

else if((ch>='0')&&(ch='0')&&(ch

else switch(ch)

{ case '

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;

}

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;

default: syn=-1; break; }

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

五、结果分析:

输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图1-3所示:

图5-1

六、总结:

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end 所有的关键字都是小写。 (2)运算符和界符

: = + - * / > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码;

token为存放的单词自身字符串; sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的算法思想:

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};

图1-1

(2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想:

首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。

图 1-2

四、词法分析程序的C语言程序源代码:

#include #include

char prog[80],token[8],ch; int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"}; scaner(); 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(); }

scaner() { sum=0;

for(m=0;m

while((ch==' ')||(ch=='\n'))ch=prog[p++];

if(((ch='a'))||((ch='A')))

{ while(((ch='a'))||((ch='A'))||((ch>='0')&&(ch

for(n=0;n

if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } }

else if((ch>='0')&&(ch='0')&&(ch

else switch(ch)

{ case '

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;

}

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;

default: syn=-1; break; }

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

五、结果分析:

输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图1-3所示:

图5-1

六、总结:

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。


相关文章

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


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


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


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


  • 编译原理学习导论 [和讯博客]
  • 文章来源: 转贴www.csdn.net 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理 ...查看


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


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


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


  • 词法分析器的设计
  • 广州中医药大学医学信息工程学院 课程名称: 专业班级: 实验参与者 (姓名.学号)实验名称: 实验成绩: 课程类别: 实 验 报 告 编译原理 计算机科学与技术(12)级 第一组 刘加彦2012081026.李汝强2010131083 张丰 ...查看


热门内容