词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)


单词符号


种别码


单词符号


种别码


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

以下是我用c语言写的词法分析程序:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 typedef struct {
  5     int key;
  6     char *value;
  7 }HASH;
  8 HASH hash[100];
  9 char str[1000];//存储输入语句数组
 10 char ch;//存储源程序段
 11 int j=0;// hash[100] 的下标
 12 int Long=0;//str[]的下标
 13 char word[10];//存储单词的容器
 14 char num[10];//存储数字的容器
 15
 16 void danzifu(char Str[]){
 17     int i;
 18     int k=0;// word[10] 的下标
 19     int h=0;// num[10] 的下标
 20     bool flag=false;
 21     for(i=0;i<Long;i++){
 22         switch(Str[i]){
 23             case ‘+‘: hash[j].key=13; hash[j].value="+";j++;break;
 24             case ‘-‘: hash[j].key=14; hash[j].value="-";j++;break;
 25             case ‘*‘: hash[j].key=15; hash[j].value="*";j++;break;
 26             case ‘/‘: hash[j].key=16; hash[j].value="/";j++;break;
 27             case ‘:‘:
 28                 if(Str[++i]==‘=‘){
 29                     hash[j].key=18; hash[j].value=":=";j++;
 30                 }else{
 31                     hash[j].key=17; hash[j].value=":";j++;
 32                     i--;
 33                 }
 34                 break;
 35             case ‘<‘:
 36                 if(Str[++i]==‘=‘){
 37                     hash[j].key=21; hash[j].value="<=";j++;
 38                 }else if(Str[i]==‘>‘){
 39                     hash[j].key=22; hash[j].value="<>";j++;
 40                 }else{
 41                     hash[j].key=20; hash[j].value="<";j++;
 42                     i--;
 43                 }
 44                 break;
 45             case ‘>‘:
 46                 if(Str[++i]==‘=‘){
 47                     hash[j].key=24; hash[j].value=">=";j++;
 48                 }else{
 49                     hash[j].key=23; hash[j].value=">";j++;
 50                     i--;
 51                 }
 52                 break;
 53             case ‘=‘: hash[j].key=25; hash[j].value="=";j++;break;
 54             case ‘;‘: hash[j].key=26; hash[j].value=";";j++;break;
 55             case ‘(‘: hash[j].key=27; hash[j].value="(";j++;break;
 56             case ‘)‘: hash[j].key=28; hash[j].value=")";j++;break;
 57             case ‘#‘: hash[j].key=0; hash[j].value="#";j++;break;
 58         }
 59         if(Str[i]>=‘a‘&&Str[i]<=‘Z‘){
 60             word[k]=Str[i];
 61             k++;
 62         }else{
 63             if(strcmp(word,"begin")==0){
 64                 hash[j].key=1; hash[j].value="begin";j++;
 65             }else if(strcmp(word,"if")==0){
 66                 hash[j].key=2; hash[j].value="if";j++;
 67             }else if(strcmp(word,"then")==0){
 68                 hash[j].key=3; hash[j].value="then";j++;
 69             }else if(strcmp(word,"while")==0){
 70                 hash[j].key=4; hash[j].value="while";j++;
 71             }else if(strcmp(word,"do")==0){
 72                 hash[j].key=5; hash[j].value="do";j++;
 73             }else if(strcmp(word,"end")==0){
 74                 hash[j].key=6; hash[j].value="end";j++;
 75             }
 76             k=0;
 77             word[10]=NULL;
 78         }
 79         if(Str[i]>=‘0‘&&Str[i]<=‘9‘){
 80             num[h]=Str[i];
 81             h++;
 82             flag=true;
 83         }else{
 84             if(flag){
 85 //                hash[j].key=11; hash[j].value=num;j++;
 86                 hash[j].key=11; hash[j].value="数字串";j++;
 87                 h=0;
 88                 num[10]=NULL;
 89                 flag=false;
 90             }
 91         }
 92     }
 93 }
 94 main(){
 95     printf("请输入源程序段:\n");
 96     do{
 97         ch=getchar();
 98         str[Long++]=ch;
 99     } while(ch!=‘#‘);
100     printf("\n%s",str);
101     danzifu(str);
102     int k=0;
103     while(hash[k].key!=0){
104         printf("\n<%d,%s>",hash[k].key,hash[k].value);
105         k++;
106     }
107 }

原文地址:https://www.cnblogs.com/mogong/p/11649327.html

时间: 2024-08-06 15:41:58

词法分析程序的设计与实现的相关文章

编译原理之词法分析程序的设计与实现

一.程序要求(以python为例). 1.词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 -  识别出有词法意义的单词(Lexemes) -  返回单词记录(单词类别,单词本身) -  滤掉空格 -  跳过注释 -  发现词法错误 2.程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 3.单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一

05 词法分析程序的设计与实现 10/10

词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 -  识别出有词法意义的单词(Lexemes) -  返回单词记录(单词类别,单词本身) -  滤掉空格 -  跳过注释 -  发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码)

5.词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词(Lexemes) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号

1014 编写完词法分析程序的感想

经过几个星期的努力,总算把词法分析的程序给完成了,总的来说这是一个坚苦而又漫长的过程.是啊,读了那么多年的书,编写词法分析程序可是第一次呀!看着劳动成果,很欣慰!虽然这不是我一个人做的,是大家的共同努力得来的. 几个星期前,当听到老师布置给我们的这个题目时,我们都蒙了,这么难的题目我们怎么会啊!毕竟我们对那个一无所知,对于老师上课的讲解还能听懂,不过理论与实践之间还是有鸿沟的.我们私下都表示不满,抗议,可是一切都是徒劳,所以我们只能尽我们自己最大的努力把程序给写出来. “也许完成不了!”两个星期

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

词法分析程序实验报告

实验一词法分析实验 商业软件工程2班  黄铭坤  201506110147 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 (1)   关键字: begin  if  then  while  do  end (2) 

词法分析程序新

词法分析程序的功能:提示用户输入一段需分析的源程序,然后程序读入该源程序的字符串进行词法分析,最后输出词法分析的结果显示在屏幕上.符号与种别码对照表:单词符号 种别码 单词符号 种别码begin     1        :          17if           2        :=        18then      3        <          20while      4       <=        22do         5 end       6    

词法分析程序(编译原理)

一:词法分析程序的功能: 输入单词串,以'begin'开始,以'#'结束.如果是文法正确的句子,则输出成功的信息:'输入单词串成功',否则返回错误提示. 例: 输入 begin a:=345 end # 输出 输入单词串成功 二:符号与种码对照表 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 <  20 while 4 <= 21 do 5 <>  22 end 6 >  23 l(l|d)* 10 >= 24 dd*

简单的词法分析程序

词法分析程序完成的是编译第一阶段的工作,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 我写的简单代码实现如下: #include<stdio.h>#include<string.h>#define N 80char word[6][10]={"begin","if","then","while","do","end"};vo