我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用C++词法分析设计方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用C++词法分析设计方法

本篇文章给大家分享的是有关如何用C++词法分析设计方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

下面文章从C++词法分析的角度出发,其实语言是一个句子的集合,而句子是由词法分析器返回的记号组成的非线性结构,C++语法分析的任务是在词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。

反映句子结构的***方法是树,常用的有分析树和语法树。分析语法结构的基本方法有两种:自上而下分析方法和自下而上分析方法。自上而下分析从根到叶子建立分析树,而自下而上分析恰好相反。在这两种情况下,分析器都是从左到右地扫描输入,每次读进一个记号。与C++词法分析类似,语法分析也具有双重含义:

①规定句子形成的规则,也被称为语法规则。程序设计语言的大部分语法规则可以用上下文无关文法(ContextFreeGrammar,简称CFG)来描述。

②根据语法规则识别记号流中的评议结构,也被称为语法分析。最有效的自上而下和自下而上的分析方法都只能处理上下文无关文法的子类,如LL文法和LR方法,但是它们已足以应付程序设计评议的绝大多数语法现象。

一、任务与目的

使用C/C++程序设计语言和递归下降子程序的方法编写该函数绘图语言的C++词法分析器。并要求设计一个语法分析器的测试小程序来调用自己编写的语法分析器测试各种不同的输入。

语法分析的任务是在C++词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。语法分析所依据的是语言的语法规则,语法规则通常用上下文无关文法描述。

通过自己动手编写语法分析器,掌握正规式与正规文法、上下文无关文法(CFG)、有推导的基本概念(推导、分析树与语法树、二义性及二义性的消除)、自上而下分析(递归下降子程序方法、预测分析表方法、LL(1)文法)、自下而上分析。理解如何理论联系实际以及明白理论与实际的差别。

二、分析与设计

语法分析程序一般具有如下功能:对单词符号串进行语法分析(根据语义规则进行推导和规约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。

这里我们采用递归下降分析方法:直接以程序的方式模拟产生式产生语言的过程。它的基本设计思想是:为每一个非终结符构造一个子程序,每一个子程序的过程体中按该产生式的候选项分情况展开,遇到终结符直接匹配,而遇到非终结符就调用相应非终结符的子程序。

该分析从调用文法开始符号的子程序开始,直到所有非终结符都展开为终结符并得到匹配为止。若分析过程中达到这一步则表明分析成功,否则表明输入中有语法错误。递归下降分析对文法的限制是不能有公共左因子和左递归。由于文法是递归定义的,因此子程序也是递归的。

对于规模比较小的语言,递归下降子程序方法是很有效的方法,它简单灵活,容易构造,其缺点是程序与文法直接相关,对文法的任何改变均需对程序进行相应的修改。

这里给出C++词法分析程序大概的设计方法:

根据要求写出语法分析的上下文无关文法G;

消除上下文无关文法G的二义性;

消除上下文无关文法G的(直接)左递归,并提取左因子;

构造文法的状态转换图并且简化;

将转换图转化为EBNF表示;

从EBNF构造递归下降子程序;

以下是较为详细的设计:

总体结构与模块划分

语法测试模块(parsermain.cpp)

语法分析器模块(parser.h & parser.cpp)绘图语言解释器入口递归子程序集先序遍历并打印表达式的语法树出错处理模块词法分析器模块(scanner.h & scanner.cpp)初使化词法分析器识别出具有独立意义的最小语法单位辅助性模块

以上就是如何用C++词法分析设计方法,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用C++词法分析设计方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用C++词法分析设计方法

本篇文章给大家分享的是有关如何用C++词法分析设计方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。下面文章从C++词法分析的角度出发,其实语言是一个句子的集合,而句子是由词法
2023-06-17

JavaScript如何实现简单的词法分析器

这篇文章主要介绍了JavaScript如何实现简单的词法分析器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现简单的词法分析器文章都会有所收获,下面我们一起来看看吧。什么是词法分析器?
2023-07-05

使用英文设计方法设计中文网页的问题分析

这期内容当中小编将会给大家带来有关使用英文设计方法设计中文网页的问题分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。不顾及中文字体的特殊性,简单的照搬英文网页的设计方法,经常会降低中文网页的易读性(英文
2023-06-12

Android核心分析之一分析方法论探讨之设计意图

为什么要研究Android,是因为它够庞大,它够复杂,他激起了我作为一个程序员的内心的渴望,渴望理解这种复杂性。我研究的对象是作为手机开发平台的Android软件系统部分,而不是Dalvik虚拟机本身。作为一个从其他平台装接过来的程序员,要
2022-06-06

如何用源码分析C++ STL内存配置的设计思想

这篇文章将为大家详细讲解有关如何用源码分析C++ STL内存配置的设计思想,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面会结合关键源码分析C++STL(SGI版本)的内存配置器设计思想。
2023-06-17

Java设计模式之模板方法模式实例分析

本文小编为大家详细介绍“Java设计模式之模板方法模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式之模板方法模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。模板方法模式模板方
2023-06-29

C++引用方法如何使用

这篇文章主要讲解了“C++引用方法如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++引用方法如何使用”吧!1.什么是引用引用可以看作是一个已经定义的变量的别名,其作为变量别名而存在
2023-06-30

C++如何实现二分法求方程

这篇文章将为大家详细讲解有关C++如何实现二分法求方程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。二分法是一种求解方程近似根的方法。对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解
2023-06-15

C# 中GetAllCustomers()方法如何使用

这期内容当中小编将会给大家带来有关C# 中GetAllCustomers()方法如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先我们创建一个名为C# GetAllCustomers()方法,代码
2023-06-17

c#中如何使用listbox方法

这篇文章主要介绍“c#中如何使用listbox方法”,在日常操作中,相信很多人在c#中如何使用listbox方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c#中如何使用listbox方法”的疑惑有所帮助!
2023-06-26

C# 中DrawString()方法如何使用

这期内容当中小编将会给大家带来有关C# 中DrawString()方法如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C# DrawString()方法简单实例:首先,让我们从例子开始,以下是一个最
2023-06-17

thinkphp3.23的c方法如何使用

这篇文章主要讲解了“thinkphp3.23的c方法如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“thinkphp3.23的c方法如何使用”吧!thinkphp3.23中的c方法是T
2023-07-04

C# 中如何使用GreetPeople方法

这期内容当中小编将会给大家带来有关C# 中如何使用GreetPeople方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。.Net Framework还是比较常见的东西,这里我们主要介绍C# GreetP
2023-06-17

如何分析Shell时间运算以及时间差计算方法

这篇文章的内容主要围绕如何分析Shell时间运算以及时间差计算方法进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!最近一段时间,在处理Shell 脚本
2023-06-28

C#中的方法如何调用

这篇文章主要介绍了C#中的方法如何调用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的方法如何调用文章都会有所收获,下面我们一起来看看吧。可以使用类的实例从另一个类中调用其他类的公有方法。例如,方法 Fi
2023-06-17

C#中 CheckStatus()方法如何使用

这篇文章将为大家详细讲解有关C#中 CheckStatus()方法如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Timer类:设置一个定时器,定时执行用户指定的函数。定时器启动后,系
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录