当前位置: 首页 > 编程日记 > 正文

编译器实现(五)

1.自底向上的分析

最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入,R表示生成了最右推导,而数字1则表示使用了先行的一个符号)。

1.1自底向上分析概览

自底向上的分析程序使用了显式栈来完成分析,这与非递归的自顶向下的分析程序相类似。分析栈包括记号和非终结符,以及一些后面将讨论到的其他信息。自底向上的分析开始时栈是空的,在成功分析的末尾还包括了开始符号。

自底向上的分析示意为:

  

  分析栈在左边,输入位于正中间,而分析程序的动作则在右边。

 

自底向上的分析程序有两种可能的动作(除“接受”之外):
1) 将终结符从输入的开头移进到栈的顶部。
2) 假设有BNF选择A→α,将栈顶部的串α归约为非终结符A。

因此自底向上的分析程序有时称作是移进-归约分析程序。

移进动作是由书写单词s h i f t指出的。归约动作则由书写re d u c e单词给出且指出在归约中所用的B N F选择。

另一个特征是(由于技术原因???):

总是将文法与一个新的开始符号一同扩充 这就意味着若S是开始符号,那么就将新的开始符号S增加到文法中,同时还添加一个单元产生式到前面的开始符号中:

S → S

例:

  E→ E

E → E + n | n

  

移进-归约分析程序描绘出输入串的最右推导,但推导步骤的顺序却是颠倒的。

在表5 - 2中,相对应的推导是E’  => E => E + n =>  n + n

这样的推导中的终结符和非终结符的每个中间串都称作右句型。

句柄:(参考:https://blog.csdn.net/it_dream_er/article/details/53612006)

  直接短语中的最左直接短语为该句型的句柄

移进-归约分析程序将终结符从输入移进到栈直到它能执行一个归约以得到下一个右句子格式。它发生在位于栈顶部的符号串匹配用于下一个归约的产生式的右边。这个串、它在右句子格式中发生的位置以及用来归约它的产生式被称作右句型的句柄(handle) 。

例如,在右句子格式n + n 中,它的句柄是由最左边的单个记号n 与用来归约它以产生新的右句型E + n的产生式E→n 组成的串。这个新句型的句柄是整个串E + n (一个可行的前缀)以及产生式E→E + n。有时由于表示法上的弊端,我们要用串本身来作为句柄。

判断分析中的下一个句柄是移进-归约分析程序的主要任务。

1.2 LR(0)项的有穷自动机与LR(0)分析

1.2.1 LR(0)项

例:

S→S
  S→( S ) S | ε
这个文法存在着3个产生式选择和8个项目:
  S→.S
  S→S.
  S→. ( S ) S
  S→( .S ) S
  S→( S. )S
  S→( S ) .S
  S→( S )S.

定义:

上下文无关文法的LR (0)项(LR(0) item)(或简写为项( item ) )是在其右边带有区分位置的产生式选择。我们可用一个句点(当然它就变成了元符号,而不会与真正的记号相混淆)来指出这个区分的位置。所以若A→α是产生式选择,且若β和γ 是符号的任何两个串(包括空串),且存在着βγ = α,那么A→β.γ 就是LR(0)项。之所以称作LR(0)项是由于它们不包括先行的显式引用。

项目概念的思想就是指项目记录了特定文法规则右边识别中的中间步骤。特别地,项目A→β.γ是由文法规则选择A→α构成(其中 α = βγ ),这一点意味着早已看到了β,且可能从下一个输入记号中获取γ。从分析栈的观点来看,这就意味着β必须出现在栈的顶部。项目A→.α 意味着将要利用文法规则选择 A→α 识别A(将这样的项目称作初始项(initial item)。项目 A→α. 意味着α现在位于分析栈的顶部,而且若 A→α 在下一个归约中使用的话,它有可能就是句柄(将这样的项目称作完整项(complete item))。

1.2.2 项目的有穷自动机

注:概念解释:闭包:

参考:https://blog.csdn.net/n6323438/article/details/51996551

https://blog.csdn.net/woailuo453786790/article/details/51254124

LR (0)项可作为一个保持有关分析栈和移进-归约分析过程的信息的有穷自动机的状态来使用。

对1.2.1的例子:

NFA:

  文法有8个LR(0)项,所以这个NFA就有8个状态。

  

DFA:

  DFA的开始状态是由项目S→ .S 组成的集合的 ε- 闭包,即集合{S→.S, S→. ( S ) S, S →.}。由于S有一个从S→ .S到S→ S.的转换,所以也就存在着一个从开始状态到DFA状态{ S→ S. } 的对应转换(不存在从S→ S.到任何其他项目的转换)。在(上也有一个从开始状态到DFA状态的转换{ S→ (. S ) S, S→.( S ) S, S→. }({ S→ (.S ) S }的ε闭包。DFA状态{ S→ (. S ) S, S→ . ( S ) S, S→ . }在(上有到其自身的转换,在S上也有到{ S→ ( S.) S }的转换。这个状态在(上有到状态{ S→ ( S ). S,S→ .( S ) S, S → . }的转换。最后,这一最终状态在(上有到前面所构造的状态{ S→ (. S ) S, S→ .( S ) S, S → . }的转换。图是完整的D FA,为了便于引用还给各个状态编了号(按照惯例,状态0是开始状态)。

 

1.2.3 LR(0)分析算法

例:文法 A → (A)| a

LR(0)项:

状态0:初始状态

A’ → .A

A → .(A)

A → .a

状态1:(识别状态0 的第一个LR(0)项,接收A)

A’ → A.

状态2:(识别状态0的第三个项,接收a,较为简单)

A → a.

状态3:接收" ( " (接收a,将转到状态2)

A  →  (.A)

A  → .(A)

A  → .a

状态4:从状态3接收A

A → (A.)

状态5:从状态4接收 )

A → (A).

构造DFA

以((a))分析动作:将状态数和字符都压入栈中:

初步解释,待验证:

初始状态0

终止状态1

遇到状态2和状态5进行规约,状态1也是规约状态

分析表:

  

  注:空白项表示的是识别出错。

1.3 SLR(1)分析

名词解释:https://blog.csdn.net/zuzhiang/article/details/79047743

1.3.1 SLR(1)分析算法

通过使用输入串中下一个记号来指导它的动作。首先,它在一个移进之前先考虑输入记号以确保存在着一个恰当的DFA。其次,使用非终结符的Follow集合来决定是否应执行一个规约。

定义:SLR(1)分析算法(SLR(1) parsing algorithm)。令s 为当前状态(位于分析栈的顶部)。则动作可定义如下:

1. 若状态s 包含了格式A→α.Xβ的任意项目,其中X是一个终结符,且X是输入串
   中的下一个记号,则动作将当前的输入记号移进到栈中,且被压入到栈中的新
   状态是包含了项目A→aX.b的状态。
  2. 若状态s 包含了完整项目A→γ.,则输入串中的下一个记号是在Follow(A)中,所
   以动作是用规则A→γ 归约。用规则S→S归约与接受等价,其中S是开始状态;
   只有当下一个输入记号是$时,这才会发生。在所有的其他情况中,新状态都
   是如下计算的:删除串α和所有它的来自分析栈中的对应状态。相对应地,
   DFA回到α开始构造的状态。通过构造,这个状态必须包括格式B→γ. Aβ的一
   个项目。将A压入到栈中,并将包含了项目B→αA.β的状态压入。
  3. 若下一个输入记号都不是上面两种情况所提到的,则声明一个错误。

SLR(1)文法判断:

当且仅当对于任何状态s,满足一下两个条件

1) 对于在s 中的任何项目A→α.Xβ,当X是一个终结符,且X在Follow (B) 中时,s 中没有完整的项目B→γ.。

2) 对于在s 中的任何两个完整项目A→α.和B→β.,Follow (A)∩ Follow(B)为空。

若第1个条件不满足,就表示这是一个移进-归约冲突(shift-reduce conflict)。

若第2个条件不满足,就表示这是一个归约-归约冲突(reduce-reduce conflict)。

例:

接着1.2.2的例子进行,分析串()()

SLR(1)分析表:

分析动作

1.3.2 用于分析冲突的消除二义性规则

在移进-归约冲突中,总是选取移进而不是归约 ,解决移进-归约冲突。

但是归约-归约冲突就要复杂一些了:这样的冲突通常(但并不是总是)指出文法设计中的一个错误(后面将给出这样冲突的示例)。

//待补充吧

1.3.3 SLR(1)分析能力的局限性

例:文法:

  

这个状态在 id 上有一个状态:

  S → id.

  V → id.

的转换。现在有 Follow (S) = {$}和 Follow (V) = { : =, $ }(由于有规则V→V := E所以有 :=,又由于E可以是V,所以有$ )。因此,SLR(1)分析算法要求在这个状态中有一个在输入符号$下的利用规则S→ id 和规则V→ id 实现的归约(这是一个归约-归约冲突)。这个分析冲突实际上是一个由SLR(1)方法的缺点所引起的“假冒”问题。实际上当输入为$时,用V → id 实现的归约永远也不应该在这个状态中,这是由于只有到看到记号:=和被移进后,变量才会出现在语句的末端。

  

1.3.4 SLR(k)文法  ps:先记着吧,不看了

同其他分析算法一样, SLR(1)分析算法可被扩展为 SLR(k)分析,其中的分析动作是基于k≥1个先行的符号之上。利用上一章定义的集合Firstk

Followk,Slr(k)分析程序使用以下两个规则:

1) 若状态s 包含了格式A→α.Xβ(X是一个记号),且Xw∈ Firstk(Xβ)是输入串中之后的k个记号,那么该动作就是将当前输入记号移进到栈中,而且被压入到栈中的新状态是包含了项目A→α.Xβ的状态。

2) 若状态s 包含了完整项目A→α.,且w ∈ Followk(A)是输入串中之后的k 个记号,则动作用规则A→α归约。

当k > 1时,SLR(k)分析比SLR(1)分析更强大,但由于分析表的大小将按k的指数倍增长,所以它又要复杂许多。非SLR(1)的典型语言构造可利用LRLA(1)分析程序处理得更好一些,它可使用标准的消除二义性的规则,或将文法重写。

1.4 一般的LR(1)和LALR(1)分析

L R ( 1 )规范( canonical)分析。这种方法解决了上一节最后所提到的SLR(1)分析中出现的问题,但它却复杂得多。实际上在绝大多数情况下,通常地,一般的LR(1)分析太复杂以至于不能在大多数情况下的分析程序的构造中使用。幸运的是,一般的LR(1)分析的一个修正——称作LALR(1) (即“先行” LR分析)在保留了LR (1)分析的大多数优点之外还保留了SLR(1)方法的有效性。LALR(1)方法已成为诸如用于诸如 Yacc 这样的分析程序生成器所选用的方法。

1.4.1 LR(1)项的有穷自动机

LR(1)项应是由LR(0)项和一个先行记号组成的对。利用中括号将LR(1)项写作

[A→α.β α ]

其中A→α.β是一个LR(0)项,而α 则是一个记号(先行)。

LR(1)分析的自动机的非 ε- 转换:

定义: LR(1)转换(第1部分)的定义(definition of LR(1) transitions (part 1))。假设有LR(1)项目[A→α.Xγ, a],其中X是任意符号(终结符或非终结符),那么X就有一个到项目[A→αX.γ, a]的转换。

请注意在这种情形下,两个项目中都出现了相同的先行a,所以这些转换并不会引起新的先行的出现。只有 ε- 转换才“创建”新的先行,如下所示。

定义: LR(1)转换(第2部分)的定义(definition of LR(1) transitions (part 2))。假设有LR(1)项目[A→α.Bγ,a],其中B是一个非终结符,那么对于每个产生式B→β和在 First(γa) 中的每个记号β都有到项目[B→.β,b] 的 ε- 转换。

例:

文法: A→ ( A ) | a

通过扩充文法以及构造初始的LR(1)项目[A→.A, $]来构建它的LR(1)项目集合的DFA。

状态0:   [A→.A, $]

[A→. ( A ), $]

[A→. a, $]

状态1:  [A’→A., $]

状态2:   [A→ ( .A ), $ ]

[A→. ( A ), ) ]

[A→. a, ) ]

状态3:  [A→a ., $ ]

状态4:  [A→ ( A. ), $]

状态5:  [A→ ( . A ), ) ]

[A→ . ( A ), ) ]

[A→. a, ) ]

状态6:  [A→a ., ) ]

状态7:   [A→ ( A ) ., $]

状态8:   [A→ ( A . ), ) ]

状态9:  [A→ ( A ) ., ) ]

DFA:

1.4.2 LR(1)分析算法

一般的LR(1)分析算法令s 为当前状态(位于分析栈的顶部),则动作定义如下:
  ① 若状态s 包含了格式[A→a.Xb, a]的任意LR(1)项目,其中X是一个终结符且是输入串中
    的下一个记号,则动作就是将输入记号移进到栈中,且被压入到栈中的新状态是包含了LR(1)
    项目[A→aX.b, a]的状态。
  ② 若状态s 包含了完整的LR(1)项目[A→a., a],且输入串中的下一个记号是a,则动作就是
    用规则A→a归约。用规则S→S (其中S是开始状态)实现的归约等价于接受(只有当下一个输入
    记号是$时才发生)。在其他情况下,新状态的计算如下:将串a以及与它对应的所有状态从分
    析栈中删去。相应地DFA返回到a开始构造的状态。通过构造,这个状态必须包括格式[B→
    a.Ab, b]的L R ( 1 )项目。将A压入到栈中,并压入包含了项目[B→aA.b, b] 的状态。
  ③ 若下一个输入记号不是上面所述的任何一种情况,则声明一个错误。

LR(1)文法判断:

① 对于在s 中的任何项目[A→a.Xb, a],且X是一个终结符,则在s 中没有格式[B→b., X ]的项目(否则就有一个移进-归约冲突)。

② 在s 中没有格式[A→a., a]和[B→b., a]的两个项目(否则就有一个归约-归约冲突)。

可从表达一般L R ( 1 )分析算法的L R ( 1 )项目集合的D FA中构造出一个分析表。该表具有与S L R ( 1 )分析程序的表格完全相同的格式,如下例所示。

例: 接1.4.2的例子 

在归约动作中的文法规则选择使用了以下的编号:
(1) A→(A)
(2) A→a
因此在状态3中带有先行$的项r 2指出了规则A→a 实现的归约。

一般LR(1)分析表

例:解决SLR(1)文法的先行问题

文法:

S→ i d | V : = E
    V→ i d
    E→ V | n

为这个文法构造LR(1)项目集合的D FA。其开始状态是项目[S→.S, $]的闭包。

状态0:

[S’→.S, $]
    [S →.i d, $]
    [S →.V : = E, $]
    [V →.i d, : =]

状态1:

[S’→.S, $]

状态2:

[S→.i d, $]
    [V →.i d, . = ]

状态3:

[S →V . : = E, $]

状态4:

[S →V : = .E, $]
    [E →.V, $]
    [E →.n, $]
    [V →.i d, $]

。。。

LR(1)项目集合的DFA

状态2,这是SLR(1)分析引起的冲突状态。LR(1)项目可由它的先行清晰地区分出两个规约。

1.4.3 LALR(1)分析

LALR(1)分析算法表明了它使得标识所有这样的状态和组合它们的先行有意义。在这样做时,我们总是必须以一个与LR(0)项目中的DFA相同的DFA作为结尾,但是每个状态都是以带有先行集合的项目组成。在完整项目的情况下,这些先行集合通常比相应的Follow集合小;因此,LRLA(1)分析保留了LR(1)分析优于SLR(1)分析的一些特征,但是仍具有在LR(0)项目中的DFA尺寸较小的特点。

LALR(1)分析的原则:

(1) LALR(1)分析的第1个原则

L R ( 1 )项目的D FA的状态核心是L R ( 0 )项目的D FA的一个状态。

(2) LALR(1)分析的第2个原则
  若有具有相同核心的LR(1)项目的DFA的两个状态s1 和s2,假设在符号X上有一个从s1 到状
  态t1 的转换,那么在X上就还有一个从状态s2 到一个状态t2 的转换,且状态t1 和t2 具有相同的
  核心。

例:续上面的例子

  

转载于:https://www.cnblogs.com/x-police/p/10979616.html

相关文章:

Python字符串的修改以及传参

前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的): 1 #!/usr/bin/env python2 #-*-coding:utf-8-*-3 __author__ …

充血模式和贫血模式

贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。 优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Busin…

java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时

…如何限制A的实现在方法签名中使用B的某个实现?用例这是一个Unit接口和两个实现它的枚举:public interface Unit { ... }public enum ForceUnit implements Unit { ... }public enum MassUnit implements Unit { ... }属性界面使用哪个:publ…

ANDROID_MARS学习笔记_S01_011ProgressBar

文档是这样来设置样式 <ProgressBarandroid:layout_width"wrap_content"android:layout_height"wrap_content"style"android:style/Widget.ProgressBar.Small"android:layout_marginRight"5dp" /> 1.xml <RelativeLayout xml…

怎样使phpnow1.5.6-1支持firebird

&#xff08;以下部分步骤可能不是必要&#xff0c;自己测试。&#xff09; 环境&#xff1a;windows&#xff0c;phpnow1.5.6-1 默认支持mysql&#xff0c;修改配置文件&#xff0c;使之支持firebird。 php.ini 的位置 &#xff1a; php-5.2.14-Win32\php-apache2handler.ini …

php 引入其他文件中的变量

在php的开发过程中&#xff0c;如果所有的代码都写在同一个文件中的话&#xff0c;那么文件中的代码数量是否太多了,一来不便维护&#xff0c;二来对于编辑器也是个负担include("class0.php");在php文件的首部引入即可;转载于:https://www.cnblogs.com/wrhbk/p/10985…

java struts技术_java技术框架之:struts

一&#xff1a;struts的优缺点优点&#xff1a;1、开源&#xff1a;2、利用Struts提供的taglib可以大大节约开发时间。3、维护扩展比较方便。通过一个配置文件&#xff0c;即可把握整个系统各部分之间的联系&#xff0c;这对于后期的维护有着莫大的好处。4、表现与逻辑分离5、表…

BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries BIT 就行了.时间复杂度O(N log N). 速度垫底了QAQ 你们都会SAM。。。。----------------------…

centos7下Gitlab+Jenkins部署持续集成CI环境

1.基本环境 主机&#xff1a;win10&#xff0c;IP&#xff1a;192.168.0.111&#xff1b;部署机器centos7&#xff0c;IP&#xff1a;192.168.0.65&#xff1b;内存推荐到8G&#xff0c;实测需要6G以上&#xff0c;以免出现内存不够用而报错。 2.安装gitlab需要的组件 [rootloc…

VIM7.3添加中文帮助文档

安装中文帮助文档之前首先执行下列操作&#xff1a;在home目录下列新建文件夹 &#xff1a;.vim ------------------>.vim是一个隐藏文件&#xff0c;不要漏了 “.”.vim/plugin ---------->.vim目录下的plugin文件夹.vim/doc ------------->.vim目录下的doc文件夹.v…

安卓java代码标签_Android实现动态添加标签及其点击事件

在做Android开发的时候&#xff0c;会遇到动态添加标签让用户选择的功能&#xff0c;所以自己写了个例子&#xff0c;运行效果图如下。标签可以左右滑动进行选择&#xff0c;点击的时候&#xff0c;会弹出toast提示选择或者取消选择了哪个标签。通过动态添加TextView作为标签&a…

Windows 7 SDK Fails to Install with Return Code 5100 (GRMSDK_EN_DVD.iso)

来源&#xff1a;http://support.microsoft.com/kb/2717426/de 不对全文做翻译了&#xff0c;总结一下&#xff1a; 原因&#xff1a;电脑上已经安装了新版本的Visual C 2010 Redistributable运行库 解决办法&#xff1a;卸载Visual C 2010 Redistributable&#xff0c;然后再安…

Android动画效果translate、scale、alpha、rotate详解

动画类型Android的animation由四种类型组成XML中 alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果JavaCode中 AlphaAnimation渐变透明度动画效果ScaleAnimation渐变尺寸伸缩动画效果TranslateAnimation画面转换…

对javscript中Object.defineProperty的理解

自己在使用vue的过程中经常会用到听到数据双向绑定这个词&#xff0c;而且我们还可以直接通过调用this.msg(this表示vue实例),来获取data上的数据&#xff0c;以前一直不太明白为什么可以这样获取&#xff0c;直到有一天我在论坛里看到了寻找海蓝96这位大佬写的文章,才明白其原…

java kafka 集群消费_kafka集群搭建和使用Java写kafka生产者消费者

转自&#xff1a;http://chengjianxiaoxue.iteye.com/blog/21904881 kafka集群搭建1.zookeeper集群 搭建在110&#xff0c; 111,1122.kafka使用3个节点110&#xff0c; 111,112修改配置文件config/server.propertiesbroker.id110host.name192.168.1.110log.dirs/usr/local/kafk…

Java之替换“\n”符号

开发平台&#xff1a;Android 4.1.2 在去除字符串中的换行符(\n)的时候&#xff0c;写成str.replace("\\n", "")才能正确执行。str.replace("\n","") &#xff0c;str.replaceAll("\\n","")&#xff0c;str.repla…

ThinkPHP项目笔记之登录,注册,安全退出篇

1.先说注册 a.准备好注册页面&#xff0c;register.html,当然一般有&#xff0c;姓名&#xff0c;邮箱&#xff0c;地址等常用的。 b."不要相信用户提交的一切数据",安全&#xff0c;安全是第一位的。所以要做判断&#xff0c;客户端要做基本判断&#xff0c;为了防止…

c语言第八次作业

1.选择法排序。输入一个正整数n(1<n<10)&#xff0c;再输入n个整数&#xff0c;将他们从大到小排序后输出。试写出相应程序。 #include<stdio.h>int main (void){int i,index,k,n,t;int a[10];printf("输入数据的个数n:");scanf("%d",&n);…

java线程池的工作原理_Java 线程池的介绍以及工作原理

在什么情况下使用线程池&#xff1f;1.单个任务处理的时间比较短2.将需处理的任务的数量大使用线程池的好处:1. 降低资源消耗&#xff1a;      通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度&#xff1a;      当任务到达时&#xff0c…

.NET 程序设计实验 含记事本通讯录代码

实验一 .NET 程序设计基本流程 【实验内容】 一、控制台、Windows 应用程序、ASP.NET 程序开发流程 1、熟悉开发平台 2、分别开发控制台、Windows 应用程序、ASP.NET 程序下显示“Hello world&#xff01;”的应用程序&#xff0c; 掌握新建、基本输入输出、程序流程、程序调试…

复制构造函数(拷贝构造函数)

也许很多C的初学者都知道什么是构造函数&#xff0c;但是对复制构造函数&#xff08;copy constructor&#xff09;却还很陌生。对于我来说&#xff0c;在写代码的时候能用得上复制构造函数的机会并不多&#xff0c;不过这并不说明复制构造函数没什么用&#xff0c;其实复制构造…

VMware上实现LVS负载均衡(NAT)

本文LVS的实现方式採用NAT模式。关于NAT的拓扑图请參照我的上一篇文章。本文纯粹实验。NAT在生产环境中不推荐使用。原因是Load Balancereasy成为瓶颈&#xff01; 1.VMware9上安装CentOS-6.5-x86_64-minimal版 2.安装完毕后将其hostname设置为LVS-master hostname LVS-master …

java se13安装教程_在Linux发行版中安装Java 13/OpenJDK 13的方法

本文介绍在Linux发行版Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装Java 13/OpenJDK 13、Java SE Development Kit 13的方法。在Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装OpenJDK 13访问JDK 13版本页面以下载最新的版本&am…

Java api 入门教程 之 JAVA的IO处理

IO是输入和输出的简称&#xff0c;在实际的使用时&#xff0c;输入和输出是有方向的。就像现实中两个人之间借钱一样&#xff0c;例如A借钱给B&#xff0c;相对于A来说是借出&#xff0c;而相对于B来说则是借入。所以在程序中提到输入和输出时&#xff0c;也需要区分清楚是相对…

如何编辑PDF文件,PDF编辑器如何使用

如何编辑PDF呢&#xff1f;其实大多数人都不知道该如何下手&#xff0c;部分人会选择将PDF文件转换成Word然后进行编辑&#xff0c;其实这种方法比较麻烦&#xff0c;大大拉低了我们的工作效率。如果想要提高工作效率更加快速的编辑PDF文件&#xff0c;就可以选择迅捷PDF编辑器…

hdu 4366 Card Collector (容斥原理)

http://acm.hdu.edu.cn/showproblem.php?pid4336题意&#xff1a;有 n 张卡片 &#xff0c;每张卡片出现的 概率 是 pi 每包至多有 一张卡片 &#xff0c;也有可能没有 卡片 。求 需要买多少包 才能集齐 n 张卡片 &#xff0c;求包数的 期望 。题解 &#xff1a; 容斥原理…

java语言二维数组转置_java实现二维数组转置的方法示例

本文实例讲述了java实现二维数组转置的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这里在文件中创建Test2、Exchange、Out三个类在Exchange类中编写exchange()方法&#xff0c;在方法中创建两个数组arraryA、arraryB&#xff0c;arraryB[j][i]arraryA[i][j]实…

使用Apache cxf 和Spring在Tomcat下发布Webservice指南

转载 http://blog.csdn.net/zhangzhaokun/article/details/4750021 最近学习了如何使用apache cxf和Spring发布webservice&#xff0c;虽然网上的资料很多&#xff0c;但是没有一个文档可以让读者按照操作步骤来实现完整的发布流程&#xff0c;都需要多篇文件杂合在一起&#x…

srcache_nginx redis 构建缓存系统应用一例

为什么80%的码农都做不了架构师&#xff1f;>>> srcache_nginx模块相关参数介绍&#xff0c;可以参见 《memc_nginxsrcache_nginxmemcached构建透明的动态页面缓存》。 redis是一种高效的key-value存储。 下面举一例应用&#xff0c;看配置&#xff1a; upstream r…

mysql 删除 修改密码_Mysql数据库root密码忘记了,如何在不删除Mysql的情况下修改密码...

1.cmd中使用 net stop mysql 命令停掉正在运行的mysql 数据库。2.在本地中复制Mysql数据库的安装路径一直到bin路径下。3.到cmd执行 "pushd 步骤2复制路径" 的命令&#xff0c;就会到Mysql数据库安装的bin路径下。4.紧接著执行 mysqld --skip-grant-tables 命令…