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

词法分析程序(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

1、代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char wsym[80],ssym[8]; //wsym用于存放输入数组,ssym用于存放输出数组 
char ch;
int row,syn,sum,m,i,p;
char *word[6]={"begin","if","then","while","do","end"};

void getsyn(){
  for(i=0;i<8;i++)
    ssym[i]=NULL; //初始化 
  ch=wsym[p++]; 
  while(ch==‘ ‘){   //若为空格,则不进行操作,下标下移 
    ch=wsym[p]; 
    p++;
  }
  if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)){   //判断是否为字母 
    m=0;
  while((ch>=‘0‘&&ch<=‘9‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)){
    ssym[m++]=ch;
    ch=wsym[p++];
  }
  ssym[m++]=‘\0‘;
  p--;
  syn=10;
  for(i=0;i<6;i++){
    if(strcmp(word[i],ssym)==0){   //判断于关键字是否一样 
      syn=i+1;
      break;
    }
  }
  }else if(ch>=‘0‘&&ch<=‘9‘){   //判断是否为字母 
    sum=0;
    while(ch>=‘0‘&&ch<=‘9‘){
      sum=sum*10+(ch-‘0‘);
      ch=wsym[p++];
    }
    p--;
    syn=11;
  }else switch(ch){   //其它字符 
    case ‘+‘:
      ssym[0]=ch;syn=13;
      break;
    case ‘-‘:
      ssym[0]=ch;syn=14;
      break;
    case ‘*‘:
      ssym[0]=ch;syn=15;
      break;
    case ‘/‘:
      ssym[0]=ch;syn=16;
      break;
    case ‘:‘:
      i=0;
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch==‘=‘){
        ssym[i++]=ch;
        syn=18;
      }else{
        syn=17;
        p--;
      }
      break;
    case ‘<‘:
      i=0; 
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch==‘=‘){
        ssym[i++]=ch;  
        syn=21;
      }else if(ch==‘>‘){
        ssym[i++]=ch;
        syn=22;
      }else{
        syn=20;
        p--;
      }  
      break;
    case ‘>‘:
      i=0;
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch==‘=‘){
        ssym[i++]=ch;
        syn=24;
      }else{
        syn=23;
        p--;
      }
      break;
    case ‘=‘:
      ssym[0]=ch;syn=25;
      break;
    case ‘;‘:
      ssym[0]=ch;syn=26;
      break;
    case ‘(‘:
      ssym[0]=ch;syn=27;
      break;
    case ‘)‘:
      ssym[0]=ch;syn=28;
      break;
    case ‘#‘:
      ssym[0]=ch;syn=0;
      break;
    case ‘\n‘:
      syn=100;
      break;
    default:
      syn=-1;
      break;
  }
}

int main(){
    p=0;
    row=1;
    printf("请输入语句段:");
    do{
      ch=getchar();
      wsym[p++]=ch; 
    }while(ch!=‘#‘);
    p=0;
    do{
      getsyn();
    switch(syn){
      case -1:
        printf("在第%d行有错误!",row);
        break;
      case 100:
        row+=1;
        break;
      case 11:
        printf("(%d,%d)\n",sum,syn);
        break;
      default:
        printf("(%s,%d)\n",ssym,syn);
        break;
  }
    }while(syn!=0);
}

2、测试结果

    

原文地址:https://www.cnblogs.com/jwwzone/p/11647176.html

时间: 2024-10-13 23:42:42

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

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

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

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

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

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

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

词法分析程序实验报告

实验一词法分析实验 商业软件工程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

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

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

编写词法分析程序

Note: 这学期修了严厉的Mr.J的编译原理,不定期更新笔记! 欢迎指正! TEST 语言的词法规: 标识符:字母打头,后接任意字母或数字 保留字:标识符的子集,包括:if,else,for,while,do, int,write,read, 无符号整数:由数字组成,但最高位不能为0,允许一位的0, 分界符:(.).;.{.} 运算符:+.-.*./.=.<.>.>=.<=.!=.== 注释符:/* */ 正则表达式: 标识符:        ( a|b|--|z|A|B--|Z