java lr(0)如何实现移进和规约_宝贝,来,满足你,告诉你学 Java 应该买什么书?...

319837224a5ba3ce5761ead110667010.png

Java 要学的知识点非常非常多,但经典的书籍就那么几本,不算多。所以,这里我推荐给你的,能买就赶紧买,别害怕花钱,尤其是遇到屯书的日子,便宜的时候多买点,香啊。
这次推荐的书单也是最近好几个宝贝咨询我的一个问题,“哥,学 Java 应该买什么书啊?好纠结,你能不能把你私藏的书单全部贡献出来?”
好吧,宝贝,这次满足你们,好吧?
这是我整理的Java学习资料https://pan.baidu.com/s/1y4mc-gJYKrtQOXOoDBuymg 提取码: @编程技术宅

https://pan.baidu.com/s/1Unf6zPrRURPdEFTNfSpqjw 提取码: @编程技术宅 1)《Head First Java》

5edb212ab7c66274e979cba8f362867e.png


这本书之所以作为首推,就是因为看起来不枯燥,真的。里面插画非常多,有意思的小话题很多,如果对技术图书望而生畏的话,这本书很值得一看。
骚话很多的一本书,只能这么悄悄地告诉你。不只是读死书,你还会玩游戏、拼图、解谜题以及以意想不到的方式与 Java 交互。2)《Java 核心技术卷 1》

42a5ec5b8e976d121c21b83ea68ce08e.png


这本书涉及的知识点非常全面,入门的话,只看卷 1 就足够了,卷 2 可以暂时不看。
上面这两本书里面还是会讲到 Swing、AWT、Applet 的内容,都可以略过,感觉这些内容真的没必要讲了,不知道是不是出版社为了凑数,《Java核心技术》都出到第十版了,还有这些内容,真的是醉了。

3)《Java编程思想》

33b71bfb90d81cc8e090427d64f2107b.png


很多老师喜欢把这本书作为入门书推荐,但我觉得实在是不应该,因为新手根本驾驭不了这本书。这本书还是需要一定编程基础的人读的,否则就很容易劝退了。
毕竟讲的是思想,既然是思想,肯定就是在用的基础上进行升华总结,去探讨为什么的层面。那也就是说,只要你靠着前面两本书入了门,那么就需要这本书进行锤炼一下了。

4)《Effective Java》

290375c321a80a01c74395714d11be96.png

就说一句,“我很希望 10 年前就拥有这本书。可能有人认为我不需要任何 Java 方面的书籍,但我需要这本”——Java 之父詹姆斯高司令鼎力推荐的书,你就知道要不要读了?

这本书的所有条目都具有指导性建议,对提高你的 Java 编程艺术很有帮助。5)《阿里巴巴 Java 开发手册》

65eb5720a3c17684234a5f7952310419.png


目前最新版是泰山版,《阿里巴巴 Java 开发手册》属于代码规范级别的开源手册,网上都可以找到下载地址,也可以在「沉默王二」公众号后台回复「手册」获取下载地址。
《Java 开发手册》是每个 Java 程序员都值得拥有的一本参考指南。该手册涵盖了编程规约、异常日志、单元测试、安全规约、MySQL 数据库、工程结构、设计规约灯 7 个部分,参考价值极大。6)《Java网络编程》

ee09f5a03a254589ed7a9a159a9408de.png

《Java网络编程》是一本 API 书,主要就是对网络编程中的一些类和方法的介绍,但网络编程是 Java 开发中很重要的一块,所以这本书对一个 Java 程序员来说还是很重要的。值得一看。

7)《Java 并发编程实战》

740626035f79b9ce71aeed3277dbe9e4.png

这本书可以称得上是 Java 并发编程方面的圣经了,虽然看起来比较枯燥,但核心知识点都讲到了。从并发和线程安全性的基本概念出发,介绍了如何使用类库来提供基本的并发方案,包括如何利用线程来提高并发应用程序的吞吐量、如何识别可并发执行的任务、如何提高单线程子系统的响应性、如何确保并发程序执行预期的任务,如何提高并发代码的性能和可伸缩性等等内容。8)《深入浅出 Java 多线程》

363fbfc7fe08a1c25353f36d0ebb6d4f.png

这本书是几个阿里朋友合伙重写了一本书,关键是开源的,直接通过链接就可以在线阅读了。9)《深入理解 Java 虚拟机》

5078c675a2b423068d1c9efa241b77f4.png


目前已经出到第三版,我自己在家最近也在重新读,《深入理解 Java 虚拟机》是唯一一本我们国内程序员写的经典书,可以媲美《Java 编程思想》。
必须承认,这本书确实是提升 Java 功力的良药。这本书让我对于虚拟机的运行机理与底层知识真正来了一次近距离接触,许多知识不再只是符号或文字的堆叠,而是一种真正地理解。值得大力推荐。10)《Java 性能权威指南》

681d8f9198b6df2ed4469a8650d92d99.png


通过前面 9 本书,基本上就把 Java 所有的知识点都学完了,那么就差如何对性能做出优化了,这本书值得拥有。11)《代码整洁之道》

477a6f9455b2338d2504ce54aa4c6743.png


你现在是不是已经做好了提升编程艺术的准备了,那么这本《代码整洁之道》就可以让你的代码看起来更优雅,更整洁,更像大师写的。软件的质量,不仅依赖于架构,更与代码质量息息相关。而代码的质量与其整洁度成正比关系,越整洁的代码,其质量毫无疑问的就会越高。由于本书中的例子是由 Java 实现的,因此 Java 程序员在读这本书的时候有着天然的优势。12)《设计模式之禅》

35126345873a31abe0dd7010b57ad187.png


设计模式之禅(第 2 版)》是设计模式领域公认的 3 本经典著作之一,也是我们国内程序员写的一本书,趣味化十足,读起来也非常容易理解。这本书值得所有的程序员读一读,但 Java 程序员读起来更容易上手,因为源码是 Java 完成的。作者名叫秦小波,和我最喜欢的作家王小波同名。
大家都听说过,学习设计模式非常的重要,那么为什么这么重要呢,设计模式到底是什么?打个比喻学编程就像学武功一样。
武功要练得很牛逼,有两样东西不能丢。第一,是内功;第二,是武功秘籍。内功对应到编程就是我们编程基础能力,那编程的设计模式就可以想象成武术中的武功秘籍。
设计模式就是根据不同类型场景,设计优雅的(编码)解决方案。学好设计模式有很多好处,比如,容易看懂经典代码中的逻辑(很多优秀的开源框架大量使用了设计模式);应对面试时对答如流(设计模是面试重点);可以编写出优雅的解决方案(或者代码)。

13)《Spring 实战》

d307920e99054d49bd5af6a2b744c06f.png


好了,既然要学 Java,想要成为一名称职的 Java 工程师,Spring 就没法忽视,对吧?这本书既可以被刚开始学习 Spring 的读者当作学习指南,也可以被那些想深入了解 Spring 某方面功能的专业用户作为参考用书。
当然,如果你想在 Web 开发方面更上一层楼的话,我再厚着脸皮推荐一下我自己写的《Web 全栈开发进阶之路》,里面也涉及到了一些 Spring 的常用知识点。14)《Spring Boot+Vue全栈开发实战》

8d309d6bac28aa9a3914dda237715fc1.png


Spring Boot 方面就必须推荐一下我的好朋友江南一点雨的书,关键是他本人录制了很多免费的视频,这些视频配套着他的书看,绝对可以对 Spring Boot 有着充分的掌握。顺带把前端最火的 Vue 入门了,不香吗?
好了好了,书籍整体就先推荐到这吧,足够宝贝你看上一段时间了,加油哦。

作者:沉默王二
链接:https://juejin.im/post/5ef7edd06fb9a07e8223eb32
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LR(0)分析的构造一般分为以下几个步骤: 1. 根据给定的文法G,构造文法的所有LR(0)项集。 2. 对于每个LR(0)项集I,对于每个终结符a,计算出GOTO(I,a)。 3. 对于每个LR(0)项集I,对于每个文法符号X,计算ACTION[I,X]和GOTO[I,X]。如果X是一个终结符,则ACTION[I,X]是移进项;如果X是一个非终结符,则GOTO[I,X]是一个项集。 4. 对于每个LR(0)项集I和每个文法符号X,如果ACTION[I,X]和GOTO[I,X]都存在,则需要解决冲突。如果ACTION[I,X]和GOTO[I,X]都是移进项,则需要进行移进-归约冲突的解决;如果ACTION[I,X]和GOTO[I,X]都是规约项,则需要进行规约-规约冲突的解决。 下面是Java语言实现LR(0)分析构造的示例代码: ``` import java.util.*; public class LR0Table { private Grammar grammar; private List<LR0ItemSet> itemSets; private Map<Integer, Map<String, LRAction>> actionTable; private Map<Integer, Map<String, Integer>> gotoTable; public LR0Table(Grammar grammar) { this.grammar = grammar; itemSets = new ArrayList<>(); actionTable = new HashMap<>(); gotoTable = new HashMap<>(); buildItemSets(); buildActionTable(); buildGotoTable(); } private void buildItemSets() { // TODO: 构造所有LR(0)项集 } private void buildActionTable() { for (int i = 0; i < itemSets.size(); i++) { LR0ItemSet itemSet = itemSets.get(i); Map<String, LRAction> row = new HashMap<>(); for (LR0Item item : itemSet.getItems()) { if (item.isReduceItem()) { if (item.getProduction().getLeft().equals(grammar.getStartSymbol())) { row.put("$", new AcceptAction()); } else { for (String symbol : item.getLookaheads()) { row.put(symbol, new ReduceAction(item.getProduction())); } } } else { String symbol = item.getNextSymbol(); if (grammar.isTerminal(symbol)) { LR0ItemSet nextItemSet = itemSet.goTo(symbol); int j = itemSets.indexOf(nextItemSet); row.put(symbol, new ShiftAction(j)); } } } actionTable.put(i, row); } } private void buildGotoTable() { for (int i = 0; i < itemSets.size(); i++) { LR0ItemSet itemSet = itemSets.get(i); Map<String, Integer> row = new HashMap<>(); for (String symbol : grammar.getSymbols()) { if (!grammar.isTerminal(symbol)) { LR0ItemSet nextItemSet = itemSet.goTo(symbol); int j = itemSets.indexOf(nextItemSet); if (j >= 0) { row.put(symbol, j); } } } gotoTable.put(i, row); } } public LRAction getAction(int state, String symbol) { Map<String, LRAction> row = actionTable.get(state); if (row != null) { return row.get(symbol); } return null; } public int getGoto(int state, String symbol) { Map<String, Integer> row = gotoTable.get(state); if (row != null) { Integer nextState = row.get(symbol); if (nextState != null) { return nextState; } } return -1; } } ``` 其中,LR0Table类LR(0)分析,包括文法对象grammar、所有LR(0)项集itemSets、ACTIONactionTable和GOTOgotoTable。在构造LR(0)分析时,首先调用buildItemSets()方法构造所有LR(0)项集,然后调用buildActionTable()方法构造ACTION,最后调用buildGotoTable()方法构造GOTO。在buildActionTable()方法中,对于每个LR(0)项集I和每个文法符号X,如果ACTION[I,X]存在,则将其加入ACTION中;在buildGotoTable()方法中,对于每个LR(0)项集I和每个非终结符X,如果GOTO[I,X]存在,则将其加入GOTO中。在getAction()方法中,给定状态state和输入符号symbol,返回ACTION[state,symbol];在getGoto()方法中,给定状态state和非终结符symbol,返回GOTO[state,symbol]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值