2013年4月13日
摘要: 上一篇文章对大部分文法都构造出了一个使用的状态机了,这次主要来讲右递归的情况。右递归不像左递归那么麻烦,因为大部分右递归写成循环也不会过分的让语法树变得难以操作,不过仍然有少数情况是我们仍然希望保留递归的语法树形状,譬如C++的连等操作,因此这里就来讲一下这个问题。 右递归是怎么形成的呢?在这里我们先不想这个问题,我们来看一个普通的文法。在上一篇文章我们已经说过了,如果一条文法有一个非终结符引用... 阅读全文
posted @ 2013-04-13 09:49 陈梓瀚(vczh) 阅读(2125) 评论(1) 推荐(2) 编辑
  2013年3月24日
摘要: 一、 这篇文章是应之前在微博上爆过的下个周末某出版社的线下活动而写的。回顾我和C++在这个世纪的第二个春天开始发生过的种种事情,我发现我并不是用一个正常的方法来学会如何正常使用C++的。我的C++学习伴随着很多其他流行或者不流行的语言。现在手中掌握的很多淫荡的技巧正是因为学习了很多编程语言的缘故,不过这并不妨碍我正常地使用C++来在合理的时间内完成我的目标。 学习C++是一个艰难的过程。如果从... 阅读全文
posted @ 2013-03-24 14:40 陈梓瀚(vczh) 阅读(57758) 评论(68) 推荐(70) 编辑
  2013年1月25日
摘要: 本来每年都要写一篇年经帖来提高一下知名度的,但是最近因为做GacUI太兴奋,竟然把这件事情给忘了,实在是罪过。如果要说我2012年做过的什么事情最重要,那当然要属开发了GacUI(Home Page, Codeplex, Github)和创建了粉丝群(啊哈哈)了吧。博客到现在还有三个坑没填完,分别是那个已经坑了好久、大家都要看、但是我却不知道要写什么的《C++使用技巧》,还有两个大家不怎么想看的《可配置语法分析器开发纪事》和《GacUI与设计模式》。关于GacUI,我已经在微博上做了许多广告,也有一些人开始尝试使用它了。目前GacUI还处于一个凑合着能用的beta状态,我在接下来的很长一段时间 阅读全文
posted @ 2013-01-25 22:30 陈梓瀚(vczh) 阅读(3060) 评论(1) 推荐(4) 编辑
  2013年1月1日
摘要: 上一篇博客写到了如何给一个非终结符的文法规则构造出一个压缩过的下推状态机,那么今天说的就是如何把所有的文法都连接起来。其实主要的idea在(三)和他的勘误(三点五)里面已经说得差不多了。但是今天我们要处理的是带信息的transition,所以还有一些地方要注意。所以在这里我们先把几条文法的最后的状态机都列出来(大图):接下来的这一步,就是要对所有靠非终结符(Exp啊Term这些)进行跳转的transition都执行上一篇文章所说的传说中的交叉链接。在产生链接的时候,我们给shift和reduce的边分别加上shift和reduce。而shift和reduce是有参数的——就是被shift走的状 阅读全文
posted @ 2013-01-01 15:55 陈梓瀚(vczh) 阅读(2106) 评论(0) 推荐(0) 编辑
  2012年12月23日
摘要: 本来说这一篇文章要把构造确定性状态机和look ahead讲完的,当我真正要写的时候发现东西太多,只好分成两篇了。上一篇文章说道一个基本的状态机是如何构造出来的,但是根据第一篇文章的说法,这一次设计的文法是为了直接构造出语法树服务的,所以必然在执行状态机的时候就要获得构造语法树的一切信息。如果自己开发过类似的东西就会知道,类似LALR这种东西,你可以很容易的把整个字符串分析完判断他是不是属于这个LALR状态机描述的这个集合,但是你却不能拿到语法分析所走的路径,也就是说你很难直接拿到那颗分析树。没有分析树肯定是做不出语法树的。因此我们得把一些信息插入到状态机里面,才能最终把分析树(并不一定真的要 阅读全文
posted @ 2012-12-23 00:30 陈梓瀚(vczh) 阅读(2765) 评论(0) 推荐(2) 编辑
  2012年12月7日
摘要: 刚刚发了上一篇文章之后就发现状态机画错了。虽然LiveWriter有打开博客并修改文章的功能,不过为了让我留下一个教训,我还是决定发一篇勘误。这个教训就是,作分析的时候不要随便“跳步”,该一步一步来就一步一步来。其实人呢,就是很容易忘掉以前的教训的了。第一个告诉我不能这么干的人其实是小学三年级的数学老师。当时我因为懒得写字,所以计算应用题的时候省了几步,被批评了。故事就从状态机开始。文法我就不重复了,见上一篇文章。现在我们从状态机开始。第一个状态机是直接从文法变过来的:然后我们把所有的非终结符跳转都通过Shift和Reduce连接到该非终结符所代表的状态机的状态上面,就会变成下面的图。具体的做 阅读全文
posted @ 2012-12-07 18:50 陈梓瀚(vczh) 阅读(1447) 评论(0) 推荐(1) 编辑
摘要: 上一篇博客讲到了构造符号表的事情。构造完符号表之后,就要进入语义分析的后一个阶段了:构造状态机。跟我以前写的如何实现正则表达式引擎的两篇文章讲的一样,自动机先从Epsilon Nondeterministic Automaton开始,然后一步一步构造成Deterministic Automaton。但是语法分析和正则表达式有很大不同,那么这个自动机是什么样子的呢?(对学术感兴趣的人可以去wiki一下“下推自动机”)下推自动机和有限自动机的区别是,下推自动机扩展成普通的自动机的时候,他的状态的数目是无限的(废话)。但是无限的东西是没办法用编程来表达的,那怎么办呢?那就加入一个不定长度的“状态描述 阅读全文
posted @ 2012-12-07 16:44 陈梓瀚(vczh) 阅读(4880) 评论(3) 推荐(4) 编辑
  2012年11月29日
摘要: 群号:31724825 在最近这几年里,一起讨论编译器的人也不多,一般都是ooseven、@装配脑袋、@空明流转(<--高手,要跪)、@belleveinvis等这几个人。而且也零星有一些我也不记得叫什么名字的在我的评论里面提出过一些很好的建议,让我得到了充分的学习。因此我想,如果有兴趣的人可以加进来一起讨论的话,应该不仅对我,对大家也是有好处的。而且我本人喜欢的领域也比较分散,譬如图形界面、软... 阅读全文
posted @ 2012-11-29 18:57 陈梓瀚(vczh) 阅读(1587) 评论(4) 推荐(0) 编辑
摘要: 上一篇博客讲到了构造语法树的问题。有朋友在留言问我,为什么一定要让语法分析器产生语法树,而不是让用户自己决定要怎么办呢?在这里我先解答这个问题。 1、大部分情况下都是真的需要有语法树 2、如果要直接返回计算结果之类的事情的话,只需要写一个visitor运行一下语法树就好了,除去自动生成的代码以外(反正这不用人写,不计入代价),代码量基本上没什么区别 3、加入语法树可以让文法本身描述... 阅读全文
posted @ 2012-11-29 00:51 陈梓瀚(vczh) 阅读(3085) 评论(7) 推荐(1) 编辑
  2012年11月21日
摘要: 就像之前的博客文章所说的,(主要还是)因为GacUI的原因,我决定开发一个更好的可配置轻量级语法分析器来代替之前的落后的版本。在说这个文章之前,我还是想在此向大家推荐一本《编程语言实现模式》,这的确是一本好书,让我相见恨晚。 其实说到开发语法分析器,我从2007年就已经开始在思考类似的问题了。当时C++还处于用的不太熟练的时候,难免会做出一些傻逼的事情,不过总的来说当年的idea还是能用的。从那... 阅读全文
posted @ 2012-11-21 22:46 陈梓瀚(vczh) 阅读(6229) 评论(6) 推荐(3) 编辑