我的程序(3):词法分析器

c语言实现词法分析器 词法分析器的功能:输入源程序,输出单词字符。单词字符一般可以分为下面五种。 (1)关键字 是由程序语言定义的具有固定意义的标识符。有时称这些标识符为保留字或者基本字。例如c语言中的int,char,define,strcut,double,if,else.等等 (2)标识符 用来表示各种名字,如变量名,数组名,过程名。 (3)常数 常数的类型一般有整形,实型,布尔型等 (4)运算符 如+,-,*,/。 (5)界符 如逗号,分号,括号,%,//,等。 词法分析器的目标就是把程序分成一个一个单词。并给出单词符号 阅读详情

/*****************************C_minus词法分析器 1.0版 *********************************
*  作者:温铭
*  Email: moonbingbing@gmail.com
*  版权所有(C) 2005.11
***************************************************************************************/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>

//****************************************
char * change(char *ps,char *pt);      //处理路径中的反斜杠问题。因为在字符串中要用//表示/
int  searchkey(char *word,struct key tab[],int n);//二分法查找关键字
int  searchsymbol(char c,struct symbol tab[],int n);
void getword(int c,FILE * p);
//****************************************
//用到的结构数组:
struct  key{          //关键字表
    char*   word;
    int     value;
}keytab[] = {
         "else",  0,
         "if",    1,
         "int",   2,
         "return",3,
         "void",  4,
         "while", 5,
};
//****
struct   symbol{        //符号表
      char  c;
      int   value;
}symboltab[] = {
        '(', 0,
        ')', 1,
        '*', 2,
        '+', 3,
        ',', 4,
        '-', 5,
        '/', 6,
        ';', 7,
        '<', 8,
        '=', 9,
        '>', 10,
        '[', 11,
        ']', 12,
        '{', 13,
        '}', 14,
};
//*****************************************

//用到的常量
enum{MAX = 50,
     NKEYS = sizeof keytab / sizeof keytab[0],
     NSYMBOL = sizeof symboltab / sizeof symboltab[0]
};
//*****************************************

//用到的全局变量
int flagnum = 0;  //用来防止出现10t这种情况被当作数字处理。这种情况程序报错
int countnum = 0;
int countid  = 0;
int countfault = 0;
int type[] = {0,1,2,3,4};            //词法分析中的类型  依次为 关键字,数字,id,符号
char array[MAX];           //存放getword中的字符串


//*****************************************

main()
{
 int c;
 int flag;     //判断搜索函数是否成功返回
    char s[MAX];       //数组s,t用来存放读取文件的路径
 char t[2 * MAX];
 char *ps = s;
 char *pt = t;
    FILE * p = NULL;

    printf("input the path of the file/n");
 scanf("%s",s);
    p = fopen( change(ps,pt),"r" );     //打开文件
    if( p == NULL ){                   //如果输入的文件路径不对或文件不存在
        printf("open fail!/n");
        exit(0);
    } 
 printf("data /t (type,value)/n");
    while( ( c = fgetc(p) ) != EOF ){
  if ( isspace(c) )       // 如果是空白字符
   continue;
  else if ( isalpha(c) ){
    getword(c,p);
             flag = searchkey(array,keytab,NKEYS);
    if ( flag >= 0 )                      //如果是关键字
     printf("%s/t(%d,%d)/n",array,type[0],flag);
    else{                                 //如果以字母开头,但不是关键字
     printf("%s/t(%d,%d)/n",array,type[2],countid);
                 countid ++;
    }
  }else if ( isdigit(c) ){         //如果是数字
              flagnum = 0;        /*解决getword中的一个bug。如果一个数字之前有超过1个的字符串,如in 2。则后面所有的数字都不能被正确分析*/

     getword(c,p);
     if ( flagnum == 0 )
      printf("%s/t(%d,%d)/n",array,type[1],countnum);
     else
      printf("%s/t(%d,%d)/t illegal input /n",array,type[4],countfault);
  }else if ( ispunct(c) ){        //如果是符号
              flag = searchsymbol(c,symboltab,NSYMBOL);
     if ( flag >= 0 )
      printf("%c/t(%d,%d)/n",c,type[3],flag);
     else{
     printf("%c/t(%d,%d)/n",c,type[4],countfault);  //出错处理
                 countfault ++;
     }
  }else{
   printf("%c/t(%d,%d)/n",c,type[4],countfault);       //出错处理
   countfault ++;
  }
 }
 return 0;
}


//*******************************************
char * change(char *ps,char *pt)     /*处理反斜杠的问题*/
{
 char *p = pt;
 char c;

 while( (c = *pt++ = *ps++) != '/0' )
  if( c == '//' )
   *pt = '//';
 return p;
}

//******************************************
int  searchkey(char *word,struct key tab[],int n)
{
 int cond;
 int low,high,mid;

 low = 0;
 high = n -1;
 while ( low <= high ){
  mid = (low +high) / 2;
  if ( ( cond = strcmp(word,tab[mid].word) ) < 0 )
   high = mid - 1;
  else if ( cond > 0 )
   low = mid + 1;
  else
   return mid;
 }
 return -1;
}

//**********************************************
int  searchsymbol(char c,struct symbol tab[],int n)
{
 
    int low,high,mid;

    low = 0;
 high = n -1;
 while ( low <= high ){
  mid = (low +high) / 2;
  if ( c < tab[mid].c)
   high = mid - 1;
  else if(c > tab[mid].c)
   low = mid + 1;
  else
   return mid;
 }
 return -1;
}
//*******************************************
void getword(int c,FILE * p)
{
 int i = 0;
 array[i] = c;
 while( (c = fgetc(p)) != ' ' && c != '/n'){
  if ( isalpha(c) | ispunct(c) )             //如果数字中有字母或字符,则报错
   flagnum = 1;                                 /*一个可能引起错误的地方。已经解决(在读入数字后,把flagnum置0,再进入getword)*/
  array[++i] = c;
 }
 array[++i] = '/0';
}

C语言词法分析器的设计与实现 程序设计语言与编译实验:C语言词法分析器的设计与实现 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows 10 软件:Code::Blocks 17.12 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 ... 阅读详情

相关推荐

编译原理 实验一《词法分析程序设计与实现》

一、实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程 语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 二、实验内容 自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。 从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继

Tsama的博客 3315

编译原理实验1《词法分析程序设计与实现》

一、实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 二、实验内容 自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。从输入的源程序中,识别出各个具有独立意义的单词,即关键字(1)、标识符(2)、常数(3)、运算符(4)、界符(5)。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,

Andy_Luke的博客 4319

Lex词法分析器

Lex词法分析器一.设计内容 熟悉并实现一个简单的词法分析器 二.设计目的 了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。 源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 三.实验步骤Lex输入文件由3个部分组成: 定义集(defini

t617的博客 8602

C语言实现词法分析器

这是笔者按照课本中的思路实现的词法分析程序,具体细节和意义请参考 《编译技术》张莉等著.–北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0 注:本程序使用文件读入的方法进行字符的读取,每次识别一个词,返回值一个词的类型,类型码在注释中给出。 代码如下:#include <stdio.h> #include <stdlib.h> #include <string

buaa1406的博客 2073

词法分析器实现过程(java和c++实现)

词法分析器是编译原理的一个实验,本文将会详细给出实现的具体步骤,利用java进行示例讲解,源码(包含java和c++两种实现方式)可在处下载。 一、 实验目的 设计、编写一个词法分析程序,加深对词法分析原理的理解。 二、 实验原理 词法分析是从左向右一个字符、一个字符地读入源程序,扫描每行源程序的符号,依据词法规则,识别单词。执行词法分析的程序称为词法分析器,将给定的程序通过词法分析器,识别出一个...

qq_40121502的博客 8079

C语言源程序词法分析器(Java实现)

一. 介绍词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。词法分析仅仅是编译程序工作中的一部分,编译程序一般可以划分为5个阶段:词法分析,语法分析,语义分析与中间代码产生,优化,目标代码生成。我们这里编写一个简单的C语言源程序词法分析器。二. 目的设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。四. 要求1、实现预处理功能源程序中可能包含有对程序执行无意义

远方水木 1万+

词法分析器Demo

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LexerDemo {     public enum TokenType     {         Word,         String,         Number, ...

weixin_34290390的博客 122

LEX & FLEX 实现C语言词法分析器

使用词法分析器自动生成器Flex实现C语言的词法分析。

IT人的日常 2万+

编译原理——词法分析器

编译原理词法分析器

wen3017的博客 1万+

设计一个简易的词法分析器

在学习编译原理时,按照《程序设计语言编译原理》(学习教材),设计了一个简单的词法分析器的代码,可以实现对关键字、标识符,数字的识别,去掉空格符等。下面对关键字和种别码的说明。1、 功能:输入源程序、分析源程序的单词,输出单词单词符号的种类如下:(1)    关键字(本例所有关键字都是大写)。DIM IF DO STOP END(2)    标识符:表示各种名字,如数组名、过程名和变量名等。标识符(...

夜希CC的博客 6345

用python手工编写一个词法分析器

用python手工编写一个词法分析器 @author:x1Nge. 编译原理基础实验 实验报告目录用python手工编写一个词法分析器实验目的过程分析内容一:编写子功能函数内容二:编写主功能函数内容三:其他功能代码运行截图及源码 实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解,这里我使用python作为开发语言。 过程分析 为了简化设计,降低难度,这里设计的词法分...

x1Nge的博客 3242

《编译与反编译技术实战》——3.1节词法分析器的设计

本节书摘来自华章社区《编译与反编译技术实战》一书中的第3章,第3.1节词法分析器的设计,作者刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区“华章社区”公众号查看 3.1 词法分析器的设计本节首先介绍词法分析器的功能及其输出的单词符号的表示方式,然后介绍其输入和处理。3.1.1 词法分析器的功能词法分析器又叫作扫描器,其功能是从左往右逐个字符地对...

weixin_34367845的博客 222

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

java实现词法分析器

实现词法分析器 实验内容要求 一、实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程 语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分 析。 二、实验内容 自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词 法分析程序的实现可以采用任何一种编程语言和编程工具。 从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算 符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Er

zhuzi的博客 1万+

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

【EPICS学习记录】根据官方教程创建一个IOC应用

参照官网给出的IOC创建教程逐步操作完成了一个IOC应用的创建,官网教程中有部分过程表述的不清晰,自己摸索之后完成了IOC的创建,并把流程记录下来。其中有一些操作不是很理解,有问题或者建议欢迎指正。

yifeng_H的博客 3661

【编译原理】flex实现词法分析器

flex自动实现词法分析器

Xechos 2万+

通过arcmap制作的第一张流域图

需要知道,识别河流依次需要填洼,流向,流量,栅格计算器,河流链接,河网分级.通过卫星图确定河流入口,在入口处画一个点,注意不要与其他河流相交。随后是进行对河流的筛选使用con函数,筛选流量大于100的河流。我们使用镶嵌工具-->镶嵌至新栅格 将两个数据合并。填洼后如图,随后进行流向的获得.使用流向工具。首先导入准备好的数据,可见两张图片并非一体。教程参考b站up:爱画地图的boney。惊醒栅格河网矢量化,进行河流分级。输入表面栅格数据,等待后如图。本次制作的是双峰县的流域图。输入流向数据,输出后如图。

pianmian1的博客 2228

词法分析器的生成器——lex/flex

文章目录前言编译器概述词法分析简介flex初步体验flex进阶yylex()模式匹配flex常用全局变量和宏条件模式 前言 关于lex和yacc的介绍看文章:编译原理之lex,yacc学习 关于flex和lex其实是类似的,lex不再赘述。 此文章主要介绍flex。thrift框架的compiler采用flex词法分析生成器来生成词法分析代码。flex通过编译thriftl.ll生成thriftl.cc文件,thriftl.cc即是该compiler的词法分析代码。 对于flex只弄懂其原理与用法,不追究

weixin_44705391的博客 6668

3D Slicer隐藏技巧:这样玩转医学影像分割与3D建模(含DICOM处理)

本文深入探讨3D Slicer在医学影像分割与3D建模中的高级应用技巧,包括多模态分割策略、三维可视化优化及DICOM数据处理。通过专业配置和Python脚本示例,帮助医疗AI开发者和影像科医师提升工作效率,实现精准的医学图像分析与建模。

weixin_28559803的博客 433

Android16 自定义HAL层适配一些VINTF和SELINUX问题修改

在RK里面一般权限矩阵在/rockchip/common/manifests/目录,我这版Android16的代码比较特殊,这里重点修改/device/rockchip/rockchip_generic/manifests/frameworks_compatibility_matrix.xml这个文件,不同的版本注册方式不同,在。hal_ruip_default.te,hal_ruip.te,attributes文件。拓展策略的方式添加,但是在Android16里面发现用不了。发现HAL层服务注册成功了。

tzj1058756809的博客 242

编译原理——词法分析器 C++实现

词法分析器实验目的单词分类表单词结构描述单词状态转换图算法描述程序结构源代码实验结果 实验目的 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程序字符串的词法分析。 培养团队合作精神,体会协同工作在解决问题中的作用。 单词分类表 单词符号 种类 种别码 单词符号 种类 种别码 未定义符号 未定义符号 0 =...

weixin_45693492的博客 2万+

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

[编译原理]词法分析器的分析与实现

词法分析概述:编译程序要对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序成为词法分析程序(或词法分析器),也称扫描器。 像用自然语言书写的文章一样,源程序是由一系列的句子组成的,句子是由单词符号按一定的规则构成的,而单词符号又是由字符按照一定的规则构成。因此,源程序实际上是由满足程序语言规范发字符按照一定的规则组合起来构成的一个字符串。 词法

童凌的技术博客 5万+

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

词法分析器的设计与实现

词法分析器读取的主要功能是输入源程序,输出单词符号,对源程序从左到右,从上到下对逐个字符进行扫描,识别开具有独立含义的最小语法单位(单词、符号),把构成源程序的字符串转换成单词符号的序列,把单词变换成长度统一的且为定长的属性字,输出单词序列用于语法分析。,功能是用于词法分析,词法分析是将字符序列转换为单词序列的过程,即输入源程序,输出单词符号。首先,设计的词法分析器具有主要的功能,包括识别输入的源代码中的各种词法单元,如关键字、标识符、运算符、分隔符等等。本次实验的任务是设计和实现一个词法分析器,也叫。

m0_68447809的博客 4402

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 【转贴优快云】关于DataGrid的精华
下一篇: 初识ERWin
wayne92
博客等级 码龄23年 55粉丝 176原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值