Welcome 微信登录

首页 / 软件开发 / C++

可配置语法分析器开发纪事(三) 生成下推自动机

可配置语法分析器开发纪事(三) 生成下推自动机

可配置语法分析器开发纪事(三) 生成下推自动机2014-11-01 cnblogs 陈梓瀚(vczh)上一篇博客讲到了构造符号表的事情。构造完符号表之后,就要进入语义分析的后一个阶段了:构造状态机。跟我以前写的如何实现正则表达式引擎的两篇文章讲的一样,自动机先从Epsilon Nondeterministic Automaton开始,然后一步一步构造成Deterministic Automaton。但是语法分析和正则表达式有很大不同,那么这个自动机是什么样...
可配置语法分析器开发纪事(三点五) 生成下推自动机的具体步骤

可配置语法分析器开发纪事(三点五) 生成下推自动机的具体步骤

可配置语法分析器开发纪事(三点五) 生成下推自动机的具体步骤2014-11-01 cnblogs 陈梓瀚(vczh)刚刚发了上一篇文章之后就发现状态机画错了。虽然LiveWriter有打开博客并修改文章的功能,不过为了让我留下一个教训,我还是决定发一篇勘误。这个教训就是,作分析的时候不要随便“跳步”,该一步一步来就一步一步来。其实人呢,就是很容易忘掉以前的教训的了。第一个告诉我不能这么干的人其实是小学三年级的数学老师。当时我因为懒得...
可配置语法分析器开发纪事(四) 构造一个真正能用的状态机(上)

可配置语法分析器开发纪事(四) 构造一个真正能用的状态机(上)

可配置语法分析器开发纪事(四) 构造一个真正能用的状态机(上)2014-11-01 cnblogs 陈梓瀚(vczh)本来说这一篇文章要把构造确定性状态机和look ahead讲完的,当我真正要写的时候发现东西太多,只好分成两篇了。上一篇文章说道一个基本的状态机是如何构造出来的,但是根据第一篇文章的说法,这一次设计的文法是为了直接构造出语法树服务的,所以必然在执行状态机的时候就要获得构造语法树的一切信息。如果自己开发过类似的东西就会知道,类似LALR这种东...
可配置语法分析器开发纪事(五) 构造一个真正能用的状态机(中)

可配置语法分析器开发纪事(五) 构造一个真正能用的状态机(中)

可配置语法分析器开发纪事(五) 构造一个真正能用的状态机(中)2014-11-01 cnblogs 陈梓瀚(vczh)上一篇博客写到了如何给一个非终结符的文法规则构造出一个压缩过的下推状态机,那么今天说的就是如何把所有的文法都连接起来。其实主要的idea在(三)和他的勘误(三点五)里面已经说得差不多了。但是今天我们要处理的是带信息的transition,所以还有一些地方要注意。所以在这里我们先把几条文法的最后的状态机都列出来(大图):本栏目更多精彩内容:h...
可配置语法分析器开发纪事(六) 构造一个真正能用的状态机(下)

可配置语法分析器开发纪事(六) 构造一个真正能用的状态机(下)

可配置语法分析器开发纪事(六) 构造一个真正能用的状态机(下)2014-11-01 cnblogs 陈梓瀚(vczh)上一篇文章对大部分文法都构造出了一个使用的状态机了,这次主要来讲右递归的情况。右递归不像左递归那么麻烦,因为大部分右递归写成循环也不会过分的让语法树变得难以操作,不过仍然有少数情况是我们仍然希望保留递归的语法树形状,譬如C++的连等操作,因此这里就来讲一下这个问题。右递归是怎么形成的呢?在这里我们先不想这个问题,我们来看一个普通的文法。在上...
C++/CX的性能陷阱

C++/CX的性能陷阱

C++/CX的性能陷阱2014-11-02 infoq 译:孙镜涛使用C++/CX编写应用程序和编写正常的C++应用程序不一样。纯C++代码和Windows运行时(WinRT)之间的互操作性出奇的昂贵。基于Sridhar Madhugiri的视频 C++/CX 最佳实战中的内容,我们在本文中列举了一些在Windows 8开发中避免性能问题的方式。边界在应用程序的边界上会产生多种性能障碍。数据转换就是其中的一个例子。考虑一下一个Web服务客户端和应用程序剩余...
linux不同环境下c/c++程序移植方法

linux不同环境下c/c++程序移植方法

linux不同环境下c/c++程序移植方法2014-11-02 博客园 EE_NovRain这边之前的大多数项目都用的java,而自己用的c++,等到快要上线的时候才发现线上机器的gcc和libc的版本都巨低,跟自己测试开发用的环境不兼容,编译出的c++可执行文件没法运行。解决c++程序的移植问题费了挺大周章,如下是一个具体记录:1、问题描述如上所述,线上机器与开发机环境不兼容,需要做c++程序的移植。2、表现细节不表,总之就是程序没法运行,找不到对应的库...
tcp连接探测Keepalive和心跳包

tcp连接探测Keepalive和心跳包

tcp连接探测Keepalive和心跳包2014-11-02 cppblog 采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是我们需要的。我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户。如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用。一种是由...
c/c++中内存对齐详解

c/c++中内存对齐详解

c/c++中内存对齐详解2014-11-11一,什么是内存对齐?内存对齐用来做什么?所谓内存对齐,是为了让内存存取更有效率而采用的一种编译阶段优化内存存取的手段。比如对于int x;(这里假设sizeof(int)==4),因为cpu对内存的读取操作是对齐的,如果x的地址不是4的倍数,那么读取这个x,需要读取两次共8个字节,然后还要将其拼接成一个int,这比存取对齐过的x要麻烦很多。二,怎么算内存对齐大小(理论)?对于简单类型,如int,char,floa...
c/c++如何读入一行不确定个数的整数

c/c++如何读入一行不确定个数的整数

c/c++如何读入一行不确定个数的整数2014-11-11假设有一个文件,文件的每一行包括n个整数,整数之间以一个空格隔开,文件总共有m行,但是事先不知道n,m。如何每次从文件中读取一行整数放到一个数组中。可以分为两步:1、首先从文件中读入一行字符串,2、然后从这一行字符串中解析出整数。对于第一步,我们可以有c、c++两种风格的做法c风格:FILE *fp = fopen("input.txt", "r");char...
C++位操作概述

C++位操作概述

C++位操作概述2014-11-11定义二进制变量:一般是以八进制或者十六进制来定义,八进制数以0开头,十六进制数以0x开头例如int a = 0x80, 这里的80只能表示8个二进制位,它表示的是int的低8位,前面的24个二进制位补0,所以a = 128;也可以 a = –0x80, 此时a = -128;8进制同理需要注意的是:如果0x…能够在整形内表示,则其默认是int,否则再看unsigned int能否表示,接着lon...
<< 141 142 143 144 145 146 147 148 149 150 >>