当前位置:首页 » 编程软件 » 编译原理为什么id不能数字开头

编译原理为什么id不能数字开头

发布时间: 2024-10-28 09:39:00

编译原理中 FIRSTVT 和LASTVT

  1. Firstvt:找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
    A->a.......,即以终结符开头,该终结符入Firstvt;
    A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt;
    A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt。

  2. Lastvt:找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
    A->.......a,即以终结符结尾,该终结符入Lastvt;
    A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt;
    A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt。

② 计算机应用专业分哪些

一 关于计算机应用技术有哪些专业

关于电脑的专业有天猫运营与创业、软件开发高级工程师、网络传媒高级工程师、互联网运营与创客、环境数字艺术创意设计、新媒体ui界面设计、游戏动漫设计、互联网+跨境电商、建筑表现大师数字艺术设计,等新兴专业在这里输入您的答案...

二 计算机都包括哪些专业啊

计算机包括的专业有:电子与通信工程、应用电子技术、电子科学与技术、计算机科学与技术、通信工程、电子信息工程、微电子技术、电子信息科学与技术、企业信息计算机管理、电子商务、经济信息管理与计算机应用、信息管理与信息系统、计算机辅助设计与制造,等等。


(2)计算机应用专业分哪些扩展阅读:

计算机专业的发展趋势和就业方向:

一、发展趋势:

计算机技术面临着一系列新的重大变革。诺伊曼体制的简单硬件与专门逻辑已不能适应软件日趋复杂、课题日益繁杂庞大的趋势,要求创造服从于软件需要和课题自然逻辑的新体制。并行、联想、专用功能化以及硬件、固件、软件相复合,是新体制的重要实现方法。

计算机将由信息处理、数据处理过渡到知识处理,知识库将取代数据库。自然语言、模式、图像、手写体等进行人-机会话将是输入输出的主要形式,使人-机关系达到高级的程度。砷化镓器件将取代硅器件。

二、就业方向

毕业生主要面向交通系统各单位、交通信息化与电子政务建设与应用部门、各类计算机专业化公司、广告设计制作公司、汽车营销技术服务等从事IT行业工作。

参考资料来源: 网络—计算机相关专业

三 计算机应用专业的课程有哪些

计算机应用专业的主要课程有:计算机应用基础、计算机组装与维护、Visual Basic语言、专业英语、计算机平面与动画设计、计算机网络基础与局域网络的建设与管理、数据库的开发与应用、广告设计与制作、网站建设与网页设计、多媒体设计与制作。
其实里面没有多少数学或者理科的知识要学,它不同于一般的计算机专业,计算机专业是要学习很多复杂的专业数学知识的,比如数学分析和线性代数等等。这个专业偏重于应用领域,与你的广告专业倒是联系很紧密,你读这个二位是很不错的选择。

四 计算机应用专业学的都有哪些方面

本专业培养适应计算机技术在企事业单位中发展、应用的需要,具有扎实的计算机基础知识、计算机专业知识和较强的计算机办公自动化、数据库等常用软件应用能力、计算机网络基本应用能力,能够在企事业单位相关部门从事计算机办公自动化和计算机软件应用等计算机相关应用工作,德、智、体、美全面发展的计算机专业高等应用型人才,实现“一张文凭,多种证书,一技之长,一专多能,品学兼优”的培养目标。

五 计算机专业的具体分类有哪些

1 软件开发(主要专业:计算机科学与技术,软件工程等),就是编写代码,开发程序。有多种开发语言C/C++,JAVA,C#等。

注:系统开发,网络编程和大型游戏还是需要学好C/C++(个人认为较难点),手机游戏需要学会JAVA。工程项目的系统软件开发,常用的是JAVA/JavaEE和C#/.NET,还有些中小型开发常用的技术Delphi,PB,PHP,ASP等等。

很多人都是从C语言开始接触编程的,它是经典,也很强大,具有承上启下的地位,可以为今后打下良好的基础。

2 计算机网络技术(主要专业:通信,网络安全与管理等),界定很宽泛,网络领域和计算机一样,发展方向细化的很详细了,完全可以独立划出计算机专业行列,主要涉及领域有通信协议,网路信息安全等等。

3 电子专业 倾向于硬件,单片机,嵌入式等

硬件方面,感觉比软件难学的多,难就难在学习实践的环境比较难找,比如嵌入式,大型机,绝不像软件学习,有个电脑连个网就齐活了,呵呵。也正因此它的含金量绝不低于软件,更主要它还比软件技术相对来说发展“稳定”,也就是俗话说的“越老越吃香”的现象更明显,更多的是个积累。

4 计算机应用技术,倾向于“应用”,本科这个专业很少见,多见于专科。研究生好像也有这个专业吧,但“此应用非彼应用”了!计算机应用就是大杂烩,什么都学,软件、硬件、网络、数据库,但都是皮毛,目标是结合其他行业领域的特点使用计算机。比如:工业设计/制图,动漫/flash,多媒体处理等等。

六 计算机专业分类

目前我国计算机专业主要分为三大类:计算机基础专业、与理工科交叉的计算机专业、与文科艺术类交叉的计算机专业。

1. 计算机基础专业

专业要求与就业方向:这些专业不但要求学生掌握计算机基本理论和应用开发技术,具有一定的理论基础,同时又要求学生具有较强的实际动手能力。学生毕业后能在企事业单位、 *** 部门从事计算机应用以及计算机网络系统的开发、维护等工作。

2. 与理工科交叉的计算机专业

与理工科交叉而衍生的计算机专业很多,如数学与应用数学专业、自动化专业、信息与计算科学专业、通信工程专业、电子信息工程专业、计算机应用与维护专业等。

1)数学与应用数学专业:

专业要求与就业方向:数学与应用数学是计算机专业的基础和上升的平台,是与计算机科学与技术联系最为紧密的专业之一。该专业就业面相对于计算机科学与技术专业来说宽得多,不但适用于IT 领域,也适用于数学领域。

2)自动化专业:

专业要求与就业方向:自动化专业是一个归并了多个自动控制领域专业的宽口径专业,要求学生掌握自动控制的基本理论,并立足信息系统和信息网络的控制这一新兴应用领域制定专业课程体系,是工业制造业的核心专业。自动化专业的毕业生具有很强的就业基础和优势。

3)信息与计算科学专业:

专业要求与就业方向:这是一个由信息科学、计算数学、运筹与控制科学等交叉渗透而形成的专业,就业面涉及到教学、商业、网络开发、软件设计等各个方面,就业率高达95%以上。

4)通信工程专业:

专业要求与就业方向:通信工程专业要求学生掌握通信基础理论和基本基础,掌握微波、无线电、多媒体等通信技术,以及电子和计算机技术,在信息时代有着极佳的就业优势。

5)电子信息工程专业:

专业要求与就业方向:电子信息工程专业是宽口径专业,主要培养信息技术、电子工程、网络系统集成等领域的高级IT 人才,毕业生可从事电子设备、信息系统和通信系统的研究、设计、制造、应用和开发工作。

(6)计算机应用专业分哪些扩展阅读:

毕业生主要面向交通系统各单位、交通信息化与电子政务建设与应用部门、各类计算机专业化公司、广告设计制作公司、汽车营销技术服务等从事IT行业工作。

WEB应用程序设计专业

毕业后能够从事网站应用程序开发、网站维护、网页制作、软件生产企业编码、软件测试、系统支持、软件销售、数据库管理与应用、非IT企事业单位信息化。

可视化程序设计专业

毕业后能够从事软件企业桌面应用开发、软件生产企业编码、软件测试、系统支持、软件销售、数据库管理与应用开发等工作。

数据库管理专业

毕业后能够从事企、事业单位数据库管理、软件开发、专业数据库应用设计与开发、数据库的应用与开发、信息管理系统开发、企、事业单位网络管理、软件销售等工作。

多媒体应用专业

毕业后能够从事计算机美工、动画制作、影视编辑与制作、广告设计与制作、多媒体综合应用开发、多媒体课件制作等工作。

移动应用开发专业

毕业后能够从事移动设备应用开发、嵌入式应用开发、移动网站开发、软件生产企业编码、软件测试、系统支持、软件销售、企、事业单位信息管理、办公自动化集成等工作。

电子政务软件专业

能够胜任基层 *** 部门、事业单位数字化政务管理系统的设计、维护与信息管理、办公自动化集成、办公室文员等工作。

软件测试专业

毕业后能够从事软件测试、软件编码、IT企事业单位系统支持、非IT企事业单位信息化软件销售等工作。

物流信息技术专业

毕业后能够胜任现代物流业信息管理,能在企事业单位从事物流系统设计、供应链管理、仓储管理以及运输等管理工作。

物流管理专业

毕业后能够胜任全省各级企事业单位物流系统设计、供应链管理、仓储管理以及运输等管理工作等工作。

网络系统管理专业

毕业后能够从事 *** 管理部门、经贸、金融、邮电、电子、学校、交通、社区以及应用计算机网络的有关行业,从事计算机网络系统的设计、维护、管理、从事网站开发与应用、网络安全管理、计算机软硬件调试、安装、计算机及网络产品营销等工作。

计算机游戏专业

毕业后能够从事网络游戏美术,网络游戏动漫设计,游戏概念/故事情节设计,网络游戏3D设计,网络游戏人物设计,网络游戏环境设计,网络游戏皮肤/纹理设计,网络游戏图形开发,网络游戏测试,网络游戏音频开发,游戏客户端开发,游戏服务器开发,游戏引擎开发,手机游戏策划,手机游戏开发,手机游戏程序开发,手机游戏美工,手机游戏测试等工作。

计算机图形/图像制作专业

毕业后能够从事广告企业平面的设计与制作、网络企业网页制作、企事业单位职员等工作。

目前,计算机专业在国内的高等院校中,以理工科的实力较强;以文科、综合性高等院校为补充,基本上每所高等院校都设有这样的专业;或者有这样的专业人才。

七 计算机应用专业包括哪些课程

计算机应用是研究计算机应用于各个领域的理论、方法、技术和系统等,是计算机学科与其他学科相结合的边缘学科 ,是计算机学科的组成部分。计算机应用分为数值计算和非数值应用两大领域。非数值应用又包括数据处理、知识处理 ,例如信息系统、工厂自动化、办公室自动化、家庭自动化 、专家系统、模式识别、机器翻译等领域。
专业主干课程,核心课程:
(一)专业骨干课程
1、计算机数学基础
是计算机专业必修的数学基础知识。针对计算机专业的特点,加强了Mathematica数学软件的应用。包含4大模块:微积分、线性代数、概率论。在微积分模块中包含了一元微积分、常微分方程、多元微积分初步、无穷级数、数值计算初步等内容。在线性代数模块中包含了行列式、矩阵、线性方程组的基本概念、基本理论及其应用;在概率论模块中包含了随机事件与概率、随机变量及其概率分布、随机变量的数字特征等内容。
2、计算机应用基础
是计算机基础教育的入门课程。主要讲授计算机的基础知识及计算机的组成原理,计算机操作系统(Windows和Dos)的概念和操作,Office办公软件Word 、Excel、PowerPoint的使用,计算机网络的基础知识以及Inter的常用操作。
3、C语言程序设计
计算机程序设计的基础知识、C语言的基本概念、顺序结构程序设计、分支结构程序设计、循环结构设计、函数、指针、数组、结构、联合以及枚举类型、编译预处理、位运算、文件等内容,掌握利用C语言进行程序设计的基本方法,以及C语言编程技巧。
4、计算机网络基础
计算机网络的基础知识、相关技术和实际应用。主要内容包括:计算机网络概述、网络体系结构、计算机局域网技术、网络中的传输介质、网络互联与Inter技术等。
5、计算机多媒体技术基础
计算机多媒体技术基础知识,主要内容包括:图象处理、声音处理、影视处理、使用Authorware编辑合成软件将各种多媒体元素组合在一起。
6、操作系统原理
操作系统的基本知识,主要内容包括进程管理、存储管理、文件管理、输入/输出系统、用户与操作系统的接口及linux操作系统简介。
7、图形图像处理
使用Photoshop软件进行图形图像处理,达到独立的进行图像编辑、图像合成、校正和调节图像的颜色,并能制作简单的特效的目的。
8、网络安全技术与防范
网络安全概述、信息安全机制、密钥分配与管理、病毒及防治措施、系统攻击入侵检测、防火墙技术、WWW安全性、电子邮件安全、其他Inter应用的安全性分析、网络操作系统安全性等。
(二)专业核心课程
1、Vf数据库应用
数据库的基本原理,数据库系统的组成;关系型数据库的特点、基本运算、数据组成;以Visual Foxpro为实例,数据库的设计和开发,掌握数据库的应用。
2、VB点NET程序设计
VB点NET程序设计语言的集成开发环境、程序设计基础、窗体和基本输出输入、常用控件、工程和程序管理、应用程序的结构、菜单程序设计、窗体设计和文件处理等。
3、JAVA程序设计
Java的语言规范、Java的编程技术及应用,主要内容有:Java基础、流程控制、方法、数组、面向对象程序设计基础、线程、图形用户界面设计等,使学生掌握用Java进行面向对象程序设计的基本方法。
4、网页制作
网站的设计、编辑、修改、上传,主要应用DreamweaverMX2004及FireworksMX2004。其中DreamweaverMX2004是网页编辑软件,讲授其表格、框架、层等布局工具及超链接、CSS样式等相关知识, Fireworks是图形/图像处理软件,静态图片的制作、处理及简单动态图片的制作。

八 计算机学科分哪些专业

1 软件开发(主要专业:计算机科学与技术,软件工程等),就是编写代码,开发程序。有多种开发语言C/C++,JAVA,C#等。

注:系统开发,网络编程和大型游戏还是需要学好C/C++(个人认为较难点),手机游戏需要学会JAVA。工程项目的系统软件开发,常用的是JAVA/JavaEE和C#/.NET,还有些中小型开发常用的技术Delphi,PB,PHP,ASP等等。
很多人都是从C语言开始接触编程的,它是经典,也很强大,具有承上启下的地位,可以为今后打下良好的基础。

2 计算机网络技术(主要专业:通信,网络安全与管理等),界定很宽泛,网络领域和计算机一样,发展方向细化的很详细了,完全可以独立划出计算机专业行列,主要涉及领域有通信协议,网路信息安全等等。

3 电子专业 倾向于硬件,单片机,嵌入式等
硬件方面,感觉比软件难学的多,难就难在学习实践的环境比较难找,比如嵌入式,大型机,绝不像软件学习,有个电脑连个网就齐活了,呵呵。也正因此它的含金量绝不低于软件,更主要它还比软件技术相对来说发展“稳定”,也就是俗话说的“越老越吃香”的现象更明显,更多的是个积累。

4 计算机应用技术,倾向于“应用”,本科这个专业很少见,多见于专科。研究生好像也有这个专业吧,但“此应用非彼应用”了!计算机应用就是大杂烩,什么都学,软件、硬件、网络、数据库,但都是皮毛,目标是结合其他行业领域的特点使用计算机。比如:工业设计/制图,动漫/flash,多媒体处理等等。

5 信息管理专业,文科转过来可能有帮助,因为也有管理方面课程,计算机方面学的多,但都不深入,理论多一些。

九 本科计算机类有哪些专业

1、计算机科学与技术专业

培养具备良好的科学素养,系统地掌握计算机科学与技术包括计算机硬件、软件与应用的基本理论、基本知识和基本技能,能在科研院所、企业事业单位、技术和行政管理等部门从事教学、科研、开发、管理等工作的高级专门人才。

课程包括电路原理、模拟电子技术、数字逻辑、数字分析、计算机原理、微机原理、微型计算机技术、计算机系统结构、计算机网络、高级语言、汇编语言、数据结构、操作系统、编译原理、系统分析与控制、信号处理原理、通信原理概论等。

2、软件工程专业

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量的软件的学科。软件工程专业是2002年国家教育部新增专业,随着计算机应用领域的不断扩大及中国经济建设的不断发展,软件工程专业将成为一个新的热门专业。

该专业以计算机科学与技术学科为基础,培养能够从事软件开发、测试、维护和软件项目管理的高级专门人才,同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、 *** 部门等,这些应用促进了经济和社会的发展,也提高了工作和生活效率。

3、信息安全专业

信息安全专业,具有全面的信息安全专业知识,是计算机、通信、数学、物理、法律、管理等学科的交叉学科,主要研究确保信息安全的科学与技术。培养能够从事计算机、通信、电子商务、电子政务、电子金融等领域的信息安全高级专门人才。

使学生具有较强的应用能力,具有应用已掌握的基本知识解决实际应用问题的能力,不断增强系统的应用、开发以及不断获取新知识的能力。努力使学生既有扎实的理论基础,又有较强的应用能力;既可以承担实际系统的开发,又可进行科学研究。

4、物联网工程专业

物联网(Inter of Things)这个词,国内外普遍公认的是 MITAuto-ID 中心Ashton 教授1999年在研究RFID时最早提出来的。在2005年国际电信联盟(ITU)发布的同名报告中,物联网的定义和范围已经发生了变化,覆盖范围有了较大的拓展,不再只是指基于RFID技术的物联网。

物联网是基于互联网,传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络又称为物联网域名。

5、数字媒体技术专业

数字媒体技术专业(Digital Media Technology),属于计算机类专业,同时也属于属于电气信息类,旨在培养具有先进的游戏设计理念、设计思想,扎实专业基础和创作实践能力的高级复合型人才。该专业主要开设有游戏策划、游戏用户体验分析、游戏开发程序设计基础、面向对象程序设计、游戏创作等课程。

与数字媒体艺术专业相比,该专业略注重技术素质的培养,可适应新媒体艺术创作、网络多媒体制作、广告、影视动画、大众传媒、房地产业的演示动画片制作工作。

6、智能科学与技术专业

智能科学与技术专业是智能科学系在2003年提出成立的,智能科学系的前身是北京大学信息科学中心,由北京大学数学系、计算机系、电子学系等10个系(所)于1985年成立,主要从事机器感知、智能机器人、智能信息处理和机器学习等交叉学科的研究和教学。智能科学与技术是面向前沿高新技术的基础性本科专业,覆盖面很广。

专业涉及机器人技术,以新一代网络计算为基础的智能系统,微机电系统(MEMS),与国民经济、工业生产及日常生活密切相关的各类智能技术与系统,新一代的人机系统技术等。

7、空间信息与数字技术专业

空间信息与数字技术专业从2004年西安电子科技大学、武汉大学首先开设至今,经过了数年发展,已成为了一个比较成熟的专业。

现在国内的空间信息与数字技术专业主要有两种内涵,一种是由武汉大学开创的(地理)空间信息与数字技术(即武大模式),另一种是西安电子科技大学开设的以外太空空间信息为研究对象的技术(即西电模式)。

(9)计算机应用专业分哪些扩展阅读:

计算机学科的特色主要体现在:理论性强,实践性强,发展迅速。

按一级学科培养基础扎实的宽口径人才,体现在重视数学、逻辑、数据结构、算法、电子设计、计算机体系结构和系统软件等方面的理论基础和专业技术基础,前两年半注重自然科学基础课程和专业基础课程,拓宽面向。

后一年半主要是专业课程的设置,增加可选性、多样性、灵活性和方向性,突出学科方向特色,体现最新技术发展动向。至今已覆盖所有二级学科课程。加强数学基础和分析能力,高等数学改上数学分析,增加计算机数学基础课程,体现在假设组合数学,增加离散数学的课时,并在计算机后续课程(如算法与数据结构、编译等课程)中体现数学应用不断线。

更重视实践性教学环节,增加实验课程、课程设计比重,注重自主性实践环节,上机实践贯穿于四年的学习中,加强知识综合运用能力的培养。

③ 编译原理词法分析实验中, 文件写入顺序的问题(fputs)

1)fopen在代码中出现2次,没有必要

2)你的程序不对 你搞混和S这个字符和TOKEN。

你的第一个WHILE读入的是字符S,而TOKEN是由若干字符S构成的。而你的SWITCH(S)里面按理应该是组成TOKEN的规则,而你直接就输出了。这样如果你要结果,我给你改了下,你看下:

int main()
{
char token[20] = {''};
char s;
char strings[10] = "(34,_)";
struct _iobuf* fp_cifa;
int i = 0, j;
strings[6] = ' '
strings[7] = ''
//fp_cifa = fopen(“D:\cifa.txt "a+");

while((size_t)i != strlen(file))
{
for(j = 0; j < 20; j++)
{
token[j] = ''
}
s = file[i++];
while(s == ' ' || s == ' ')
{
s = file[i++];
}
switch(s)
{
caseƇ':
token[0]=s;
token[1]=''
digitprint(token, value_num, num_list);
break;
case'=':
token[0]=s;
token[1]=''
digitprint(token, value_num, num_list);
//fputs(strings, fp_cifa);
break;
default:
cout<<"error"<<endl;
}
}
//fclose(fp_cifa);
return 0;
}

  • void digitprint(char* a, int& value_num_, char num_list[100][20])//a是需要评定的字符串//num在符号表中的位置,需要转化为字符串然后输入到文件中
    {
    FILE* fp_cifa;
    char c[20] = "(34,01)";
    fp_cifa = fopen("D:\cifa.txt ", "a+");
    //fputs(c, fp_cifa);
    fputs(a,fp_cifa);//这里要显示 a 而不是c 你可以把a 拼到 c然后,再显示c
    fclose(fp_cifa);
    }

④ 编译原理试题·

Lex和Yacc应用方法(一).初识Lex
草木瓜 20070301
Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler
编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分
析,公式编译等广泛领域。遗憾的是网上中文资料介绍不是过于简单,就是跳跃太大,
入门参考意义并不大。本文通过循序渐进的例子,从0开始了解掌握Lex和Yacc的用法。

一.Lex(Lexical Analyzar) 初步示例
先看简单的例子(注:本文所有实例皆在RetHat Linux下完成):
一个简单的Lex文件 exfirst.l 内容:
%{
#include "stdio.h"
%}
%%
[\n] ;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在命令行下执行命令flex解析,会自动生成lex.yy.c文件:
[root@localhost liweitest]flex exfirst.l
进行编译生成parser可执行程序:
[root@localhost liweitest]cc -o parser lex.yy.c -ll
[注意:如果不加-ll链结选项,cc编译时会出现以下错误,后面会进一步说明。]
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'
/tmp/cciACkbX.o(.text+0x37b): In function `yylex':
: undefined reference to `yywrap'
/tmp/cciACkbX.o(.text+0xabd): In function `input':
: undefined reference to `yywrap'
collect2: ld returned 1 exit status

创建待解析的文件 file.txt:
title
i=1+3.9;
a3=909/6
bcd=4%9-333
通过已生成的可执行程序,进行文件解析。
[root@localhost liweitest]# ./parser < file.txt
Var : title
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
到此Lex用法会有个直观的了解:
1.定义Lex描述文件
2.通过lex,flex工具解析成lex.yy.c文件
3.使用cc编译lex.yy.c生成可执行程序

再来看一个比较完整的Lex描述文件 exsec.l :

%{
#include "stdio.h"
int linenum;
%}
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
进行解析编译:
[root@localhost liweitest]flex exsec.l
[root@localhost liweitest]cc -o parser lex.yy.c
[root@localhost liweitest]./parser < file.txt
----- Lex Example -----
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
Line Count: 4
这里就没有加-ll选项,但是可以编译通过。下面开始着重整理下Lex描述文件.l。

二.Lex(Lexical Analyzar) 描述文件的结构介绍
Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识
别程序,由该程序识别出输入文本中的各个单词。一般可以分为<定义部分><规则部
分><用户子程序部分>。其中规则部分是必须的,定义和用户子程序部分是任选的。

(1)定义部分
定义部分起始于 %{ 符号,终止于 %} 符号,其间可以是包括include语句、声明语句
在内的C语句。这部分跟普通C程序开头没什么区别。
%{
#include "stdio.h"
int linenum;
%}
(2) 规则部分
规则部分起始于"%%"符号,终止于"%%"符号,其间则是词法规则。词法规则由模式和
动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组
成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单
词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。
类似yytext这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如果有多
行执行语句,也可以用{}括起来。
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
A.规则部分的正则表达式
规则部分是Lex描述文件中最为复杂的一部分,下面列出一些模式部分的正则表达式字
符含义:
A-Z, 0-9, a-z 构成模式部分的字符和数字。
- 指定范围。例如:a-z 指从 a 到 z 之间的所有字符。
\ 转义元字符。用来覆盖字符在此表达式中定义的特殊意义,
只取字符的本身。

[] 表示一个字符集合。匹配括号内的任意字符。如果第一个字
符是^那么它表示否定模式。例如: [abC] 匹配 a, b, 和C
的任何一个。

^ 表示否定。
* 匹配0个或者多个上述模式。
+ 匹配1个或者多个上述模式。
? 匹配0个或1个上述模式。
$ 作为模式的最后一个字符时匹配一行的结尾。
{ } 表示一个模式可能出现的次数。 例如: A{1,3} 表示 A 可
能出现1次或3次。[a-z]{5} 表示长度为5的,由a-z组成的
字符。此外,还可以表示预定义的变量。

. 匹配任意字符,除了 \n。
( ) 将一系列常规表达式分组。如:{Letter}({Letter}|{Digit})*
| 表达式间的逻辑或。
"一些符号" 字符的字面含义。元字符具有。如:"*" 相当于 [\*]。
/ 向前匹配。如果在匹配的模式中的"/"后跟有后续表达式,
只匹配模版中"/"前面的部分。如:模式为 ABC/D 输入 ABCD,
时ABC会匹配ABC/D,而D会匹配相应的模式。输入ABCE的话,
ABCE就不会去匹配ABC/D。

B.规则部分的优先级

规则部分具有优先级的概念,先举个简单的例子:

%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
%%
此时,如果输入内容:
[root@localhost liweitest]# cat file1.txt
AAAAAAA
[root@localhost liweitest]# ./parser < file1.txt
THREE
TWO
ONE
Lex分析词法时,是逐个字符进行读取,自上而下进行规则匹配的,读取到第一个A字符
时,遍历后发现三个规则皆匹配成功,Lex会继续分析下去,读至第五个字符时,发现
"AAAA"只有一个规则可用,即按行为进行处理,以此类推。可见Lex会选择最长的字符
匹配规则。
如果将规则
AAAA {printf("THREE\n");};
改为
AAAAA {printf("THREE\n");};
./parser < file1.txt 输出结果为:
THREE
TWO

再来一个特殊的例子:
%%
title showtitle();
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
%%
并输入title,Lex解析完后发现,仍然存在两个规则,这时Lex只会选择第一个规则,下面
的则被忽略的。这里就体现了Lex的顺序优先级。把这个例子稍微改一下:
%%
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
title showtitle();
%%
Lex编译时会提示:warning, rule cannot be matched.这时处理title字符时,匹配
到第一个规则后,第二个规则就无效了。
再把刚才第一个例子修改下,加深下印象!
%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
AAAA {printf("Cannot be executed!");};
./parser < file1.txt 显示效果是一样的,最后一项规则肯定是会忽略掉的。

C.规则部分的使用变量
且看下面示例:
%{
#include "stdio.h"
int linenum;
%}
int [0-9]+
float [0-9]*\.[0-9]+
%%
{int} printf("Int : %s\n",yytext);
{float} printf("Float : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在%}和%%之间,加入了一些类似变量的东西,注意是没有;的,这表示int,float分
别代指特定的含义,在两个%%之间,可以通过{int}{float}进行直接引用,简化模
式定义。

(3) 用户子程序部分
最后一个%%后面的内容是用户子程序部分,可以包含用C语言编写的子程序,而这些子
程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,
当编译时不带-ll选项时,是必须加入main函数和yywrap(yywrap将下后面说明)。如:
...
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行Lex分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}

三.Lex(Lexical Analyzar) 一些的内部变量和函数
内部预定义变量:
yytext char * 当前匹配的字符串
yyleng int 当前匹配的字符串长度
yyin FILE * lex当前的解析文件,默认为标准输出
yyout FILE * lex解析后的输出文件,默认为标准输入
yylineno int 当前的行数信息
内部预定义宏:
ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字符的
默认动作

内部预定义的函数:
int yylex(void) 调用Lex进行词法分析
int yywrap(void) 在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解
析。 因此它可以用来解析多个文件。代码可以写在第三段,这
样可以解析多个文件。 方法是使用 yyin 文件指针指向不同的
文件,直到所有的文件都被解析。最后,yywrap() 可以返回1
来表示解析的结束。

lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。
可以看成lex的升级版本。

相关更多内容就需要参考flex的man手册了,十分详尽。

四.关于Lex的一些综述
Lex其实就是词法分析器,通过配置文件*.l,依据正则表达式逐字符去顺序解析文件,
并动态更新内存的数据解析状态。不过Lex只有状态和状态转换能力。因为它没有堆栈,
它不适合用于剖析外壳结构。而yacc增加了一个堆栈,并且能够轻易处理像括号这样的
结构。Lex善长于模式匹配,如果有更多的运算要求就需要yacc了。

⑤ 什么叫活前缀,用通俗的话解答下,或者简单的例子。 这个题是编译原理的。

活前缀:右句型的前缀,而且其右端不会超过该句型的最右边句柄的末端。
右句型:最右推导可得到的句型。
最右推导:每步推导都替代最右非终结符的推导。
推导:我们说αBγ推导出αβγ,是说存在产生式B->β。
产生式:左边为非终结符,右边为终结符与非终结符组合成的串。
非终结符:是字符串的集合。
终结符:组成语言的词。如c语言中的2,a,int,if等。
句型:开始符经过若干步推导后得到的串。
前缀:如abc的前缀为a、ab、abc。
开始符:开始符是整个语言的集合。
句柄:非形式的,句柄是和某个产生式右部匹配的字符串,把句柄归约成产生式左部的非终结符,可以得到最右推导的逆过程的一步。形式的定义为:开始符s经过若干步最右推导得到αBγ,αBγ经过一步最右推导得到αβγ,若γ为终结符的集合,则β为句柄。举例:
E->E+E|E*E|-E|(E)|id,对于id+id*id,其中一个最右推导为E->E+E->E+E*E->E+E*id->E+id*id->id+id*id。在id+id*id归约成E+id*id的过程中,最左边的id是句柄。E+id*id归约成E+E*id时,最左边的id是句柄,把E+E*id归约成E+E*E时,id是句柄。把E+E*E归约成E+E时E*E是句柄。E+E归约成E时,E+E是句柄。
归约:可理解为把产生式右边的串用产生式左边的非终结符代替。
注1:再说一下活前缀,举个例子,比如E+E*E归约成E+E,句柄是E*E,那么它的活前缀就是E、E+、E+E、E+E*、E+E*E。又比如id+id*id归约成E+id*id,句柄是最左边的id,那么它的活前缀是id,因为不能超过句柄。
注2:至于为什么要给出活前缀的定义和如何用归约的方法实现语法分析,还要进一步学习。

⑥ 编译原理 FOLLOW集

因为有:
T→ F T’
T’→ *F T’
所以FIRST(T')是FOLLOW(F)的子集。所以 * 是FOLLOW(F)中的元素。
因为有:
T→ F T’
T’→ε
所以FOLLOW(T)是FOLLOW(F)的子集。
因为有:
E’→ +TE’
所以FIRST(E‘)是FOLLOW(T)中的子集。所以FIRST(E‘)是FOLLOW(F) 中的子集。
因为有:
E’→ +TE’
所以+是FIRST(E’)中的元素,所以+是FOLLOW(F)中的元素。
因为有:
E’→ ε
E → TE’
所以有:
FOLLOW(E)是FOLLOW(T)子集。前面有所以FOLLOW(T)是FOLLOW(F)的子集。所以有
FOLLOW(E)是FOLLOW(F)的子集,
由F → (E)|id
知 ) 是FOLLOW(E)的元素。所以 ) 是FOLLOW (F)的元素。
因为E是开始符号,所以有 $ 是FOLLOW(E)中的元素,所以 $ 是FOLLOW(F)中的元素。
综上所述:
FOLLOW(F)= {*,+,),$}

热点内容
微软安卓编译软件 发布:2024-10-28 12:16:05 浏览:564
苹果软件如何关闭存储 发布:2024-10-28 12:08:57 浏览:625
ie设置代理服务器地址 发布:2024-10-28 11:52:37 浏览:657
如何制作一个好的服务器 发布:2024-10-28 11:45:07 浏览:401
python核心编程第2版 发布:2024-10-28 11:40:34 浏览:504
云服务器如何搭建手游服务端 发布:2024-10-28 11:39:36 浏览:834
python读取汉字 发布:2024-10-28 11:32:32 浏览:558
文件夹运行cmd 发布:2024-10-28 11:22:34 浏览:206
我的世界空岛服务器地址 发布:2024-10-28 11:22:17 浏览:550
备课系统源码 发布:2024-10-28 11:15:23 浏览:191