自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 资源 (2)
  • 收藏
  • 关注

原创 chrome浏览器安装vue插件

chrome浏览器安装vue插件

2022-07-23 22:28:04 1558 2

原创 Stream API

Stream操作三步骤:1.创建Stream流2,中间操作3,终止操作

2022-05-07 17:37:53 339

原创 函数式接口

③函数式接口只包含一个抽象方法的接口,称为函数式接口。你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。我们可以在任意函数式接口上使用 @FunctionalInterface 注解,这样可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。自定义函数接口:@FunctionalInterfacepublic interface MyNumber{ p

2022-05-05 21:02:17 275

原创 JDK 8 接口的变化

②接口中新增的方法Ⅰ 在JDK 8中针对接口进行了增强,在JDK 8之前interface 接口名{ 静态常量; 抽象方法;}JDK 8 之后interface 接口名{ 静态常量 抽象方法 默认方法 静态方法}Ⅱ 默认方法为什么要有默认方法??在JDK 8 以前,接口中只有抽象方法和静态常量,会存在以下问题:在接口中新增方法,所有实现类都要重写该方法,不利于接口的扩展。public class Demo01Interface { A a=new B();

2022-05-04 23:45:40 209

原创 方法/构造器 引用

④方法引用与构造器引用方法引用:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来。如下三种主要使用情况:对象::实例方法类::静态方法类::实例方法对象::实例方法(x)->System.out.println(x);等同于:System.out::println;被引用的方法,参数要和接口中抽象方法的参数一样当接口抽象

2022-05-04 23:42:37 216

原创 Lambda表达式

文章目录①Lambda表达式例1:使用Runnable创建线程例2:自定义排序Lambda 表达式语法@FunctionalInterface注解说明Lambda表达式的原理Java新特性简介:速度更快代码更少便于并行最大化减少空指针异常①Lambda表达式Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升例1:使用Runnable创

2022-05-04 08:26:39 195

原创 Fork/Join

文章目录Fork/Join (工作窃取)① Fork/Join 框架简介②ForkJoinPool③ Fork/Join 框架的实现原理④ Fork/Join 框架的异常处理Fork/Join (工作窃取)① Fork/Join 框架简介Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:Fork:把一个复杂任务进行分拆,大事化小Join:把分拆任务的结果进行合并任务分割:首先 Fo

2022-05-03 14:09:15 450

原创 Volatile实现原理

文章目录Volatile底层实现DCL锁DCL需不需要加Volatile???Volatile三大特性:①保证可见性缓存一致性MESI总线嗅探总线风暴②不保证原子性解决不保证原子性添加synchronized/lock锁使用原子类解决③禁止指令重排序指令重排序:as-if-serial语义:happens-before原则:volatile禁止指令重排内存屏障Volatile底层实现保证内存可见性Volatile缓存可见性实现原理:底层实现主要通过汇编lock前缀指令,他会锁定这块区域的缓存(缓存行

2022-05-02 14:36:50 673

原创 ABA-->狸猫换太子之法

文章目录ABA问题发生ABA问题示例代码带版本号的原子操作解决ABA问题实例代码:ABA问题CAS需要检查操作值有没有发生改变,如果没有发生改变则更新。但是存在这样一种情况:如果一个值原来是A,变成了B,然后又变成了A,那么在CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的ABA问题。对于ABA问题其解决方案是加上版本号,即在每个变量都加上一个版本号,每次改变时加1,即A —> B —> A,变成A1 —> B2 —> A3。JUC包中提供了一个Ato

2022-05-01 11:09:27 189

原创 LongAdder

文章目录LongAdderAtomicLong VS LongAdderLongAdder核心思想:将热点数据分离。CAS 底层实现是在一个死循环中不断地尝试修改目标值,直到修改成功。如果竞争不激烈的时候,修改成功率很高,否则失败率很高。在失败的时候,这些重复的原子性操作会耗费性能。(不停的自旋,进入一个无限重复的循环中)LongAdderLongAdder,尝试使用分段CAS以及自动分段迁移的方式来大幅度提升多线程高并发执行CAS操作的性能!(JDK1.8新特性)在LongAdder的底层实

2022-05-01 11:04:36 258

原创 JUC-CAS机制

文章目录CAS代码实例CAS:CAS缺陷CASCAS的英文为Compare and Swap 翻译为比较并交换,是CPU硬件级别提供的功能。java.util.concurrent包中使用该技术实现乐观锁,换句话说java.util.concurrent包是完全建立在CAS之上,AQS同步组件、Atomic原子类操作等都是基于CAS实现的。CAS在JUC包中所处的位置如图:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

2022-04-30 14:11:47 1341 3

原创 Java内存模型

文章目录JMM--Java内存模型JMM的同步约定:JMM原子操作:CPU高速缓存(Cache Memory)CPU为何要有高速缓存多核CPU多级缓存一致性协议MESI如何实现线程可见①总线加锁(性能太低):②MESI缓存一致性协议:JMM–Java内存模型Java线程内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的,Java线程内存模型是标准化,屏蔽了底层不同计算机的区别。JMM的同步约定:线程解锁前,必须把共享变量 立即放回主存线程加锁前,必须读取主存中的最新值到工作内存中加锁和

2022-04-28 08:10:42 69

原创 JUC热榜前三的辅助类

文章目录JUC强大的辅助类① 减小计数 CountDownLatch (-1操作)② 循环栅栏 CyclicBarrier (+1操作)3 信号灯 SemaphoreJUC强大的辅助类JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过 多时 Lock 锁的频繁操作。这三种辅助类为:• CountDownLatch: 减少计数• CyclicBarrier: 循环栅栏• Semaphore: 信号灯① 减小计数 CountDownLatch (-1操作)CountDown

2022-04-27 17:12:38 183

原创 JUC阻塞队列

文章目录阻塞队列BlockingQueue 简介BlockingQueue 的优势BlockingQueue 核心方法抛出异常方法特殊值方法阻塞方法超时方法检测方法BlockingQueue的种类① ArrayBlockingQueue(常用)② LinkedBlockingQueue(常用)③ DelayQueue④ PriorityBlockingQueue⑤ SynchronousQueue⑥ LinkedTransferQueue⑦ LinkedBlockingDeque阻塞队列在多线程领域:在

2022-04-26 12:31:42 256

原创 ThreadPool 线程池

文章目录ThreadPool 线程池线程池简介(三大方法,七大参数,四大策略)Executor类线程池参数说明拒绝策略(重点)Executors线程池的方法与创建newCachedThreadPool(常用)(可扩容)newFixedThreadPool(常用)(固定)newSingleThreadExecutor(常用)(单个)线程池的提交方式execute()submit()线程池的关闭方式ThreadPool 线程池三大方法:newSingleThreadExecutor(常用)(单个)–&

2022-04-25 10:22:25 4693

原创 Java线程的创建方式

7.Callable&Future 接口​ 目前我们学习了有两种创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能, Java 中提供了 Callable 接口。现在我们学习的是创建线程的第三种方案—Callable 接口Callable 接口的特点如下(重点)• 为了实现 Runnable,需要实现不返回任何内容的 run()方

2022-04-24 18:51:03 2251

原创 死锁的产生及解决

文章目录死锁代码演示:验证是否是死锁:死锁产生的必要条件:什么时候会发生死锁:预防死锁①破坏互斥条件②破坏不剥夺条件③破坏请求和保持条件④破坏循环等待条件就好比,小情侣们每天都要让对方说爱自己,究竟谁更爱谁就产生了死锁,哈哈哈哈哈。解决死锁的办法就是互相给对方戴green帽死锁两个或两个以上的进程因为争夺资源造成的一种等待的过程就是死锁,如果没有外力干涉,就不可能再进行下去。代码演示:package com;public class DeadLock { //创建两个对象

2022-04-23 19:15:09 443

原创 Java并发情况下集合的线程安全性

文章目录ConcurrentModificationException并发修改异常5.1List集合的线程不安全①,使用Vector解决②,使用Collections类的synchronizedList方法③ 使用CopyOnWriteArrayList<>(重点)5.2 HashSet集合的线程不安全5.3HashMap集合的多线程不安全ConcurrentModificationException并发修改异常当我们对集合进行迭代(遍历)的时候,同时(并发)对集合进行修改,就会产生并发修改

2022-04-23 14:25:11 649

原创 线程间通信

文章目录3,线程间通信3.1使用synchronized锁创建线程进行加一减一操作3.2 使用Lock锁创建线程进行加一减一4,线程间定制化通信4.1 案例介绍3,线程间通信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析多线程编程模板:1.判断 2.干活 3.通知线程通信的两种写法synchronized()中使用wait()和notifyAll()lock()中使用Condition()的await()和signalAl

2022-04-22 17:38:23 421

原创 Lock锁操作机制

什么是Lock锁Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允 许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对 象。Lock 提供了比 synchronized 更多的功能。Lock 与的 Synchronized 区别Lock 不是 Java 语言内置的,synchronized 是 Java 语言的关键字,因此是内置特性。Lock 是一个类,通过这个类可以实现同步访问;Lock 和 synchronized 有一点非常大的不同,采用 synch

2022-04-21 16:29:00 2031

原创 Synchronized锁机制

文章目录2.1 Synchronized2.1.1 Synchronized 关键字回顾synchronized关键字的底层实现synchronized修饰代码块synchronized修饰普通方法synchronized修饰静态方法2.1.2 售票案例2.1 Synchronized2.1.1 Synchronized 关键字回顾synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在

2022-04-21 08:43:54 449

原创 JUC 入门简介(一)

1.1JUC简介在Java中,线程部分是一个重点,本篇文章说的是JUC也是关于线程的。JUC就是java.util.concurrent工具类的简称。只是一个处理线程的工具类,JDK1.5开始出现的。1.2线程和进程的概念进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分匹配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。是计算机中的关于某数据集合上的一次运行活动,是系统进行资源分配和

2022-04-20 17:36:55 634

原创 JVM中标记算法-->漏标问题

文章目录三色标记算法三色标记的类型:三色标记的算法过程:图解:对象丢失问题(漏标)漏标的两个充要条件:CMS采用了增量更新SATB标记算法C1采用的是原始快照Serial Old——Parallel Old——CMS垃圾回收器在垃圾标记阶段都采用了三色标记算法。G1采用STAB算法三色标记算法它是描述追踪式回收器的一种有效的方法,利用它可以推演回收器的正确性。,三色标记的类型:黑色:根对象,或者该对象与它的子对象都被扫描过(对象被标记了,且它的所有field也被标记完了)。灰色:对象本身

2022-04-19 14:25:56 946 1

原创 JVM 垃圾回收器(下)

文章目录⑦G1回收器:区域化分代式Garbage First(G1)横空出世的原因?Garbage First(G1)由来G1参数设置G1收集器的常见操作步骤G1收集器的适用场景分区Region:化整为零Remembered Set(记忆集)G1垃圾回收器的回收过程G1回收过程-年轻代GCG1回收过程-并发标记过程G1回收过程 - 混合回收G1回收可选的过程 - Full GCG1回收的优化建议垃圾回收器总结垃圾收集器的组合关系怎么选择垃圾回收器GC日志分析verbose:gcPrintGCDetails补

2022-04-19 13:01:02 351

原创 JVM 垃圾回收器(上)

文章目录GC分类与性能指标垃圾收集器分类按线程数分按工作模式分按碎片处理方式分按工作的内存区间评估GC的性能指标(6)性能指标:吞吐量性能指标:暂停时间吞吐量vs暂停时间不同的垃圾回收器概述垃圾回收器发展史7种经典的垃圾收集器7款经典收集器与垃圾分代之间的关系如何查看默认垃圾收集器①②Serial回收器:串行回收总结③ParNew回收器:并行回收④⑤Parallel回收器:吞吐量优先参数配置⑥CMS回收器:低延迟CMS为什么不使用标记整理算法?设置的参数小技巧JDK后续版本中CMS的变化待续... ...

2022-04-18 13:49:38 77

原创 JVM垃圾回收概念补充

文章目录System.gc()的理解手动GC来理解不可达对象的回收内存溢出内存泄漏举例Stop The World垃圾回收的并行与并发并发并行并发和并行对比垃圾回收的并行与并发安全点与安全区域安全点安全区域引用强引用举例总结软引用弱引用虚引用案例终结器引用System.gc()的理解在默认情况下,通过system.gc()者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而system.gc() )调用附

2022-04-17 00:23:50 191

原创 JVM垃圾回收的概念和算法

文章目录为什么需要GC早期垃圾回收Java垃圾回收机制优点缺点GC主要活动的区域垃圾回收相关算法标记阶段:引用计数算法循环引用举例小结可达性分析算法思路GC Roots可以是哪些?小结注意对象的finalization机制注意对象的三种状态标记过程代码演示进行GC Roots溯源命令行使用 jmap使用JVIsualVM使用MAT打开Dump文件JProfiler的GC Roots溯源常见的垃圾清除算法清除阶段:标记-清除算法执行过程什么是清除?缺点清除阶段:复制算法核心思想优点缺点注意清除阶段:标记-压缩

2022-04-15 22:38:59 100

原创 JVM执行引擎

文章目录执行引擎概述执行引擎的工作流程Java代码编译和执行过程机器码、指令、汇编语言机器码指令指令集汇编语言高级语言字节码什么是解释器(Interpreter)解释器分类Java代码的执行分类什么是JIT编译器HotSpot JVM执行方式概念解释混合模式热点代码热点探测技术方法调用计数器热点衰减回边计数器HotSpotVM 可以设置程序执行方法HotSpotVM中 JIT 分类分层编译策略总结执行引擎概述执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器三部分,执行引擎是Java

2022-04-15 00:18:30 104

原创 JVM方法区

文章目录栈、堆、方法区的交互关系方法区的理解HotSpot中方法区的演进设置方法区大小方法区的内部结构类型信息域信息方法(Method)信息non-final的类变量全局常量常量池 VS 运行时常量池常量池class文件常量池字面量符号引用运行时常量池字符串常量池基本类型包装类常量池方法区使用举例方法区的演进细节为什么永久代要被元空间替代?StringTable为什么要调整位置静态变量存放在那里?对象实例化内存布局和访问定位对象的实例化步骤(6步)对象内存布局(3类)对象访问方式(2种)java中4种(re

2022-04-12 00:01:27 1247 1

原创 JVM堆详解

堆堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local All

2022-04-10 18:53:31 116

原创 本地方法栈

Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个outofMemoryError异常。本

2022-04-09 18:56:45 139

原创 本地方法接口

文章目录什么是本地方法为什么使用Native Method?与Java环境的交互与操作系统的交互现状什么是本地方法简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “c” 告知c++编译器去调用一个c的函数。“A native method is a Java method wh

2022-04-09 18:56:24 91

原创 JVM虚拟机栈

1 虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位**(栈管运行,堆管存储)**栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是

2022-04-08 23:50:41 106

原创 运行时数据区及常量池栈

文章目录1 运行时数据区1.程序计数器2.虚拟机栈3.本地方法栈4.堆5.方法区(永久代/元空间)6.常量池:2 线程(计算机术语)JVM系统线程前言本节主要讲的是运行时数据区,它是在类加载完成后的阶段,程序进入了运行时数据区1 运行时数据区Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域。这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》中规定,jvm所管理

2022-04-07 21:45:07 112

原创 程序计数器

文章目录介绍两个常见问题:代码演示:使用PC寄存器存储字节码指令地址有什么用呢?CPU时间片介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间

2022-04-05 23:25:35 112

原创 类加载子系统

文章目录1 概述2 类加载器子系统作用3 类加载的流程① 加载阶段② 链接阶段验证:准备:解析:③ 初始化阶段① clinit② init4 类加载器的分类虚拟机自带的加载器①启动类加载器(引导类加载器,Bootstrap ClassLoader)②扩展类加载器(Extension ClassLoader)③应用程序类加载器(系统类加载器,AppClassLoader)用户自定义类加载器查看根加载器所能加载的目录5 双亲委派机制工作原理沙箱安全机制双亲委派机制的优势其它:1 概述详细图↓2 类加载

2022-04-04 19:37:23 58

原创 JVM与Java体系结构

敲门石文章目录前言1 Java vs C++2 Java生态圈3 字节码4 多语言混合编程5 Java发展的重大事件6 虚拟机与Java虚拟机1 虚拟机2 JVM初始(Java虚拟机)①应用程序②体系结构③内存管理④特性7 Java代码的执行流程8 JVM的架构模型1.基于栈式架构的特点2.基于寄存器架构的特点9 JVM生命周期1.虚拟机的启动2.虚拟机的执行3.虚拟机的退出10 JVM发展历程1.Sun Classic VM2.Exact VM3.HotSpot VM4.JRockit5.IBM的J96

2022-04-03 18:27:01 164

原创 排序与分页

排序与分页1.1 排序规则1.2 单列排序1.3 多列排序2. 分页2.1 背景2.2 实现规则2.3 拓展1.1 排序规则使用 ORDER BY 子句排序ASC(ascend): 升序DESC(descend):降序ORDER BY 子句在SELECT语句的结尾。1.2 单列排序SELECT last_name, job_id, department_id, hire_dateFROM employeesORDER BY hire_date ;SELECT

2022-04-02 22:08:02 72

原创 常用运算符

运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展:使用正则表达式查询1. 算术运算符算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。1.加法与减法运算符mysql> SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM dual;+-----+-

2022-04-02 22:06:51 631

原创 基本的SELECT语句

1. SQL概述1.1 SQL背景知识1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩荡的波动里,有一门技术从未消失,甚至“老当益壮”,那就是 SQL。45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言,SQL 的半衰期可以说是非常长了。

2022-04-02 22:05:57 213

DS-Java-master.zip

校园论坛

2022-01-03

词法分析实验报告.docx

【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统一定义; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名),结果文件中每行按如下方式组织: 单词类别码 单词的字符/字符串形式(中间仅用一个空格间隔) 单词的类别码请统一按如下形式定义: 单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码 标识符 IDENFR else ELSETK - MINU = ASSIGN 整形常量 INTCON switch SWITCHTK * MULT ; SEMICN 字符常量 CHARCON case CASETK / DIV , COMMA 字符串 STRCON default DEFAULTTK < LSS ( LPARENT const CONSTTK while WHILETK GRE [ LBRACK char CHARTK scanf SCANFTK >= GEQ ] RBRACK void VOIDTK printf PRINTFTK == EQL { LBRACE main MAINTK return RETURNTK != NEQ } RBRACE if IFTK + PLUS : COLON 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】要求将词法分析结果输出至output.txt中。 【特别提醒】(1)读取的字符串要原样保留着便于输出,特别是数字,这里输出的并不是真正的单词值,其实是读入的字符串,单词值需另行记录。 (2)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (3)在今后的错误处理作业中,需要输出错误的行号,在词法分析的时候注意记录该信息。 (4)单词的类别和单词值以及其他关注的信息,在词法分析阶段获取后,后续的分析阶段会使用,请注意记录;当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【文法定义】请到“2020年文法定义(用于查看文法,不计入成绩)”作业中查看文法 【样例输入】 coNst int cONst1 = 001, const2 = -100; const char const3 = '_'; int change1; char change3; int gets1(int var1,int var2){ change1 = var1 + var2; return (change1); } void main(){ printf("Hello World"); printf(gets1(10, 20)); } 【样例输出】 CONSTTK coNst INTTK int IDENFR cONst1 ASSIGN = INTCON 001 COMMA , IDENFR const2 ASSIGN = MINU - INTCON 100 SEMICN ; CONSTTK const CHARTK char IDENFR const3 ASSIGN = CHARCON _ SEMICN ; INTTK int IDENFR change1 SEMICN ; CHARTK char IDENFR change3 SEMICN ; INTTK int IDENFR gets1 LPARENT ( INTTK int IDENFR var1 COMMA , INTTK int IDENFR var2 RPARENT ) LBRACE { IDENFR change1 ASSIGN = IDENFR var1 PLUS + IDENFR var2 SEMICN ; RETURNTK return LPARENT ( IDENFR change1 RPARENT ) SEMICN ; RBRACE } VOIDTK void MAINTK main LPARENT ( RPARENT ) LBRACE { PRINTFTK printf LPARENT ( STRCON Hello World RPARENT ) SEMICN ; PRINT

2021-10-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除