刚写了一个词法分析器

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

今天忙了一天,做了一个C_minus的词法分析器。

下午睡醒后,写了一个文档,介绍了可以分析的范围,测试数据和主要的数据结构和算法。

晚上搞了三个多小时,不停地编译,运行,debug。当看到那期待已久的数据,感觉好爽!

因为编程的时候是对关键字,符号,数字等是分开编的。所以等明天有时间的时候,把几个程序联在一起就可以啦。等全部搞好了,把代码贴出来请大家斧正。

这个东西是编译原理的课程设计中的一个,我是用c写的,也没有用vc做界面。用户在控制台下输入文件的路径,就可以对文件进行词法分析了。

说明文档如下:(第一次写文档,请大家指点)

/************************** 说明文档***********************************

本程序可以对C_minus语言进行词法分析。

 C_minus,不是一种新的语言,她是C语言的一个子集。由Kenneth C.Louden提出并应用于教学。她主要有以下的特性:

C_minus语言的关键字:{else if int return void while},所有的关键字都是保留字,并且必须是小写。所有关键字按字母顺序排列,有利与折半查找(在关键字多的情况下可提高效率);

下面是专用符号:(  )  *  +   ,   -  /    ;   <   =   >   [   ]    {    }  (为简单起见,我已经对C_minus的符号集进行了简化。并且所有符号都按ASCII码的顺序从小到大排列,理由同上)。

其他标记是ID和NUM,通过下列正则表达式定义:ID = letter (letter | digit)* ,NUM = digit digit* .letter = a|..|z|A|..|Z|,digit = 0|..|9.注意在C_minus语言中小写和大写字母是有区别的;

空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID,NUM关键字;

注释用通常的C语言符号/ * . . . * /围起来。注释可以超过一行。注意注释不能嵌套。 特别地,引号中的/*......*/不是注释。   (因为考虑注释比较复杂,所以在这个版本中不考虑输入注释的情况)

 

 

type   0            1          2          3

       keyword   num     id       symbol

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

测试输入1:

int  main()

{

   int i = 2;

   int j ;

   if ( i > 0 )

      j = i;

   else

      j = 0;

   return 0;

}

预测输出1:

data     ( type,value)

int         (0,2)

main       (2,0)

(          (3,0)

)          (3,1)

{          (3,13)

int         (0,2)

i           (2,1)

=          (3,9)

2          (1,2)

;           (3,7)

int        (0,2)

j           (2,2)

;           (3,7)

if          (0,1)

(           (3,0)

i            (2,1)

>          (3,10)

0          (1,0)

)           (3,1)

j           (2,2)

=          (3,9)

i           (2,1)

;           (3,7)

else        (0,0)

j           (2,2)

=          (3,9)

0          (1,0)

;           (3,7)

return      (0,3)

0          (1,0)

;           (3,7)

}          (3,14)

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

测试输入2:

I am a genius!

预测输出2:

data     ( type,value)

I          (2,0)

am        (2,1)

a         (2,2)

genius     (2,3)

!          (4,0) illegal  input

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

 

 

//用到的结构数组:

struct  keyword{

    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,

};

 

 

 

 

//用到的全局变量

int  countnum = 0;

int  countid = 0;

 

 

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

算法如下:

while(读入的字符不是EOF){

       if ( isspace (c) )

            continue;

       else if( 是字母){   

           读取整个单词;

           if(是关键字)

               打印出来;

           else{

               countid++;

               打印出来;

            }

       }else if(是数字){

            读取整个数字;

            打印出来;

       }else if (ispunct(c)){

            在符号表中查找;

            if ( 在表中)

                 打印出来;

            else

                 调用出错处理程序;

       }

}

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

相关推荐

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

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

夜希CC的博客 6345

编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)

可直接运行 原创!!附录一 实验报告样式《编译原理》实验报告实验2 简单词法分析姓名 陈婷婷 学号 1009050121 班级 计科1001班时间: 2012/4/5 地点:文波 同 组 人:无 指导教师:朱少林实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。掌握从源程序文件中读...

weixin_30983965的博客 831

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

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

x1Nge的博客 3242

编译原理实验一 源程序的输入与扫描【C语言实现】

编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符。1、 编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现);然后从缓冲区中依次取出字符显示在屏幕上。2、从文件每次读入一行到输入缓冲区的功能用一个子程序实现。上机:安装所需的开发工具,输入或拷贝程序,调试。

小凯的博客 2494

词法分析器(对输入的源码进行分类识别).cpp

编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释

编译原理课程设计实验报告(源文件的输入与输出&单词扫描及识别)

编译原理课程设计实验报告(源文件的输入与输出&单词扫描及识别)

【编译原理】实验一 源程序的预处理及词法分析程序设计

设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。源程序中可能包含有对程序执行无意义的符号,要求将其剔除。首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释。输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中,syn为单词种别码。Token为存放的单词自身字符串。

qq_65319940的博客 1537

编译原理实验1-3.rar

天理计算机专业编译原理实验报告1-3,不出意外你的老师应该还是独一无二的刘教授,实验报告怎么样不清楚,但是期末总评85+,个人感觉不会太差吧,应该能给忙碌的你一点小小帮助

编译原理实验一(C-语言词法分析器的编写C语言版本)

编译原理实验一(C-语言词法分析器的编写C语言版本) 1.词法规则 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是I D和N U M,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* let..

哈哈哈哈哈哈哈哈的博客 8155

编译原理实验----源程序的输入和扫描

[实验内容]: 1、 编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现);然后从缓冲区中依次取出字符显示在屏幕上。 2、从文件每次读入一行到输入缓冲区的功能(可以用字符数组实现)用一个子程序实现。

实验一 源程序的输入和扫描 实验报告

编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符。

编译原理——词法分析器

编译原理词法分析器

wen3017的博客 1万+

实验一-源程序的输入和扫描.pdf

实验一-源程序的输入和扫描.pdf

词法分析器的生成器——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

数据中心机房设备标签规范建议

机房的维护工作中,标识管理是极其重要的一部分,从基本的线缆上跳接信息的标识,到设备、机柜标识规范的实施,不同程度的体现了标识管理的重要作用。本规范适用于机房主设备、线缆、机柜(含PDU插排)、仪器仪表、动力配套设备(各类空调、消防设备、配电柜、UPS等设备)、网络口、电源插座口的标签、标识规定。动力设备的设备编号、设备名称、生产厂商及厂商技术支持热线、设备型号、设备序列号、设备使用部门、设备责任人、设备启用时间及设备保修年限、条形码。各类标签、标识可根据设备和机柜的尺寸、大小进行调整。

有地气的强弱电小圈子 3525

2.4G射频微带线阻抗匹配设计实战(WiFi/BLE)

本文深入探讨了2.4G射频微带线阻抗匹配在WiFi/BLE产品开发中的关键作用。文章详细解析了共面波导微带线结构,提供了基于SI9000工具的阻抗计算实战指南,并总结了不同PCB板厚下的设计参数对照表。同时,文章分享了PCB布局布线、与板厂沟通以及天线匹配调试等核心避坑经验,旨在帮助硬件工程师构建从射频芯片到天线的稳定高效传输通道。

j0k1l2m3n的博客 368

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

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

weixin_45693492的博客 2万+

TPS65987D USB PD控制器:从原理到实战的完整设计指南

USB PD(Power Delivery)协议是USB Type-C接口实现高功率快充和数据传输的核心技术标准。其工作原理基于CC(Configuration Channel)引脚的双相标记编码(BMC)通信,通过协商电压和电流,实现高达100W的功率传输。这项技术的核心价值在于统一了充电标准,简化了设备间的互操作性,广泛应用于笔记本电脑、移动电源、扩展坞等设备。TPS65987D作为一款高度集成的USB PD控制器,将复杂的协议处理、电源路径管理和多重保护电路集成于单芯片,显著降低了设计复杂度。通过其可

weixin_30983965的博客 338

词法分析器 Java完整代码版

想了解更多内容,移步至编译原理专栏​​​​​​​ 这学期选修了编译原理,用的是電子工业出版社出版的《编译原理(第4版)》 最近做了第一次实验词法分析器,是教材后面的附录c.1的内容,根据下面的图创建词法分析器 课本给出了C语言版本的词法分析器,但是看着挺蛋疼的,感觉C语言的指针很烦,于是做了一个Java版本的,说简单也挺简单的(其实大部分是把C语言版本的代码直接复制过来)哈哈。 老师的...

godelgnis的博客 2万+

MagicDraw-需求图

MagicDraw学习笔记

木头征的博客 4135

【WRFDA教程】客观分析(OBSGRID)详解

客观分析(OBSGRID)详解

WW、forever的博客 1133

词法分析器的设计与实现

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

m0_68447809的博客 4402

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5852

编译原理之设计简单词法分析器(C语言)

本次的内容主要是通过c语言实现简单的词法分析器,所以理论方面的知识较少,在大家有了编译原理的基础知识后,提供代码学习。 使用语言:C语言 编译环境:vscode 什么是词法分析器 设计词法分析器 c语言代码实现 编译原理总框: 一、什么是词法分析器 词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者...

qq_41246458的博客 6099

FFmpeg 开发(14):Android FFmpeg + MediaCodec 实现视频硬解码

MediaCodec 是 Android 提供的用于对音视频进行编解码的类,它通过访问底层的 codec 来实现编解码的功能,是 Android media 基础框架的一部分,通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack 一起使用。

字节流动 3万+

OpenCV实现文档扫描OCR识别(基于Python + OpenCV,含完整代码)

在当今数字化时代,文档处理的自动化需求日益增长。文档扫描OCR(Optical Character Recognition,光学字符识别)技术成为了将纸质文档转换为可编辑电子文本的关键手段。通过Python与OpenCV库的结合,我们能够实现高效、准确的文档扫描OCR识别。这一技术在办公自动化、数字图书馆、档案管理等众多领域都有着广泛的应用。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2031
上一篇: 身份证复印件的正确使用方法
下一篇: 【转贴优快云】关于DataGrid的精华
wayne92
博客等级 码龄23年 55粉丝 176原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值