设计模式

【编译原理】c++实现自下而上语法分析器

∥☆過路亽.° 提交于 2021-01-06 10:37:11
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/9107838.html   基于C++语言实现的PL/0语言的算术表达式的自下而上的语法分析程序。该语言的其他语法实现思想与此一致,故不赘述。   运行此程序前,必须先将代码通过: 【编译原理】c++实现词法分析器 的词法分析,生成词法表(词法表是txt文件,为了语法分析成功,务必删除文件中最后空着的一行,即文件末尾不可以留空白行)。生成的该词法表为此程序的必要输入。   产生式:   S->X(AX)*|AX(AX)* X->Y(MY)* Y->I|N|(S) A->+|- M->*|/ C->=|#|<|<=|>|>=   进行自下而上的语法分析一定比自上而下要难。我们知道,做自下而上的语法的分析的核心在于“寻找可归约串”(即术语所说的“句柄”),而且要有一定的“向前展望性”,以防止在可以归约但却不应该归约的地方进行归约动作而不是继续移进下一个终结符或者非终结符。所以编译原理的语法分析做LR分析的核心目标就是能精确地控制计算机程序对待分析、编译的程序代码语句进行正确的、无二义的、符合编程者原目的的语法分析

《Java编程思想》笔记 第十四章 类型信息

故事扮演 提交于 2021-01-06 10:11:47
1.RTTI:在运行时识别一个对象类型 JAVA在运行时 有时要 识别对象和类的信息这个机制叫RTTI。Java提供了两种机制去做这件事。传统的RTTI 和 反射。 传统的RTTI 假定编译时就已经知道了所有的类型。 反射 允许在运行时发现和使用类型信息 传统的RTTI 在编译期通过Class文件识别类型信息,反射在运行期通过Class文件识别类型信息。 Java类型转换都发生在运行时期。 2.Class对象 Class对象是由Class这个类产生的,它包含了与某个类有关的信息。 每个类都有Class对象,即编译了一个新类就会产生一个该类的Class对象,并且保存在.class文件中。Class对象就是用来产生“常规”对象的。 Java使用Class对象来执行RTTI。 所有类都是第一次使用时动态加载到jvm中。 动态加载就是需要时再加载不使用不加载。 只要创建了对一个类的静态成员的引用就会加载该类。new 的时候加载类说明 类的构造器虽然没写static但也是静态方法。 一个类的Class对象载入内存后,他就会用来创建该类的对象。 2.1 获得Class对象 Class类的静态方法forName()可以通过传入一个 全限定类名(包含包名) 返回一个该 类 的Class类对象引用,此时该 类 会被加载到内存。 Class.forName("thinking14class.Test"

Nginx详解(正向代理、反向代理、负载均衡原理)

故事扮演 提交于 2021-01-06 05:40:15
Nginx配置详解 nginx概述 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过三个方面简单介绍nginx 反向代理 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道; 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户 正向代理 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理 在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

Vim文本编辑器

左心房为你撑大大i 提交于 2021-01-05 13:35:00
Vim的发布最早可以追溯到1991年,英文全称为:“Vi IMproved”,也就是对vi编辑器的提升版本,其中最大的改进当属对代码的着色功能,亦有些编程场景能够自动修正错误代码。 每当在讲课时遇到需要让学生记住的知识点时,为了能让他们打起精神来,我都会突然提高嗓门,因此有句话他们记得尤其深刻:“ 在 Linux系统 中一切都是文件,而配置一个服务就是在修改其配置文件的参数 ”。而且在日常工作中大家也肯定免不了要编写文档,这些工作都是通过文本编辑器来完成的。它默认会安装在当前所有的Linux操作系统上,是一款超棒的文本编辑器。 Vim之所以能得到广大厂商与用户的认可,原因在于Vim编辑器中设置了三种模式—命令模式、末行模式和编辑模式,每种模式分别又支持多种不同的命令快捷键,这大大提高了工作效率,而且用户在习惯之后也会觉得相当顺手。要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法(见图4-1)。 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。 输入模式:正常的文本录入。 末行模式:保存或退出文档,以及设置编辑环境。 ​ 图4-1 Vim编辑器模式的切换方法 在每次运行Vim编辑器时,默认进入命令模式,此时需要先切换到输入模式后再进行文档编写工作,而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作

双十二狂欢【30本】前端书籍,免费送送送

眉间皱痕 提交于 2021-01-05 04:04:15
总听身边的朋友抱怨,抽奖送书数量太少,总是不中奖,这次,我们联合图灵社区,送出 30本 前端技术书籍,涵盖CSS、JS、算法与数据结构、Node.js、设计模式等等。 一旦中奖,个人将独享 两本 ,书籍可在以下列表中任意挑选 ,书池如下: 抽奖形式: 本次抽奖采用助力形式,每扫码关注一个公众号,回复消息“ 1212 ”,即可增加一次助力,助力值越高,中奖概率越大,取消关注任意一个公众号,中奖后将不予兑奖,每人最多可获得两本图书。此次活动给大家预留了充足的助力时间,赶快邀请小伙伴来免费拿书吧。 2020年的锦鲤,就是你了。 活动时间:2020.12.12--2020.12.18 开奖方式:自动开奖 开奖时间:2020.12.18 20:30 前端人 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 程序员哆啦A梦 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 秋风的笔记 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 搜狐技术产品 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端印象 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端达人 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端壹栈 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端进阶指南 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 1024译站

Dimple在左耳听风ARTS打卡(第六期)

℡╲_俬逩灬. 提交于 2021-01-05 04:01:57
所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第六期打卡。 Algorithm LeetCode算法 有效的括号 ( leetcode.com/problems/v ) 题目描述 :给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 1. 左括号必须用相同的右括号闭合 2. 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 1: 输入:"()"" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "([)]" 输出: false 示例 5: 输入: "{[]}" 输出: true 这道算法题,考察的情况就不是之前那些题目一样,是常规操作了。我说的常规操作,这里的意思是说对字符串的增删改查的操作,因为你仔细查看这题,你会发现,其实这就是一道堆栈问题。 之前没做过入栈出栈的题目,刚好这道题可以拿来练手了。这题的思路,无非就是对堆栈的熟悉程度,小编给出中文版力扣中的解题思路,供大家参考。在这里,小编就不啰嗦了

Dubbo面试题(2020最新版)

不问归期 提交于 2021-01-05 01:42:02
基础知识 为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。 Dubbo 是什么? Dubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 Dubbo 的使用场景有哪些? 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo 核心功能有哪些? Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 Registry:服务注册,基于注册中心目录服务

丁威: 优秀程序员必备技能之如何高效阅读源码(二更)

北慕城南 提交于 2021-01-04 15:22:00
“我能熟练使用这个框架/软件/技术就行了, 为什么要看源码?” “平时不用看源码, 看源码太费时间,还容易忘记,工作中出现问题再针对性地阅读,效率更高。” “为了面试才需要看源码!” 。。。。。。 如果你也有类似的疑问,不妨接着往下看 1、为什么要阅读源码? 1.1 在通用型基础技术中提高技术能力 在 JAVA 领域中包含 JAVA 集合、Java并发(JUC)等, 它们是项目中使用的高频技术,在各种复杂的场景中选用合适的数据结构、线程并发模型,合理控制锁粒度等都能显著提高应用程序的可用性、健壮性,非常容易凸显出自己的技术实力,更容易受到领导的认可,助力职场。 当然通过阅读源码并不是知晓原理的唯一方法,但作为一个名程序员、直面代码,亲自感受代码的魅力或许会显得的更加直接。 1.2 在重点领域打造自己的亮点 我所在公司使用了 Dubbo、RocketMQ,我也有幸参与到这些技术栈的运用与运维,积累了丰富的使用经验,为了突出在这两个领域的优势,我详细阅读了它们的源码,在CSDN和公众号等知识分享平台发布了大量的技术文章,成体系的剖析其实现原理、架构设计理念,理论与实战相结合,让我成为在Dubbo、RocketMQ领域当仁不让的技术专家,团队中的核心骨干。 同时由于文章是成体系的,被出版社相中,邀请出书,《RocketMQ技术内幕》一书应运而生,从而成为我职业技能列表中非常亮眼的名片

设计模式(单例模式)

拈花ヽ惹草 提交于 2021-01-04 13:04:47
单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 实现 饿汉式 **优点:**没有加锁,执行效率会提高。 **缺点:**类加载时就初始化,浪费内存。 public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 静态内部类 线程安全,懒加载(懒加载建议使用) 这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。 这种方式同样利用了 classloder 机制来保证初始化 instance 时只有一个线程,它跟第 3 种方式不同的是:第 3 种方式只要 Singleton 类被装载了,那么 instance 就会被实例化(没有达到 lazy loading 效果),而这种方式是 Singleton 类被装载了,instance 不一定被初始化。因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载

Java学习第六天

爱⌒轻易说出口 提交于 2021-01-04 09:36:28
1.构造函数的作用:   实现属性的初始化   使用构造函数实现成员变量的初始化   非静态成员变量 随着对象的常见才开辟空间,所以只能使用对象来访问   静态成员变量,随着类的加载而开辟空间,可以通过类直接访问 2.static关键字: static修饰成员变量的特点: 1:static修饰的成员变量是随着类的加载而在方法区中的静态区开辟内存的 2:static修饰的成员变量是其所属类的所有对象共享的 3:static修饰的成员变量可以通过类直接访问,也可以通过对象访问 缺点 :占用内存时间太长(static修饰的变量存储在方法区的静态区中,直到程序结束才会释放内存) 3.非静态的方法:静态的和非静态的都能用  静态的先出现,非静态的后出现,静态的只能用静态的  静态的优先于非静态的开辟内存 4.静态成员变量和非静态成员变量对比: 1: 访问方式 静态成员变量可以通过类名访问,也可以通过对象访问 非静态成员变量只能通过对象来访问 2:存储位置 静态成员变量是随着类的加载在方法区的静态区中开辟内存 非静态成员变量是随着对象的创建在堆中开辟内存 3:存储数据 静态成员变量存储的是其所属类的所有对象共享的数据 非静态成员变量存储的是其所属类的每个对象特有的数据 4:生命周期   静态成员变量是随着类的加载在方法区的静态区中开辟内存,程序退出时才释放内存