Regular expressions in lexing and parsing(翻译)
词法分析和语法分析中的正则表达式
(英文原文来自rob pike 的博客 https://commandcenter.blogspot.jp/2011/08/regular-expressions-in-lexing-and.html)
从代码审查中提取的注释。我被要求更广泛传播他们。
我应该讲一些关于词法分析和语法分析中的正则表达式。正则表达式很难写,很难写好,而且相对于其他技术来说可能是昂贵的。(即使当它们在N*M时间内被正确实现,它们有显著的开销,特别是如果它们必须捕获输出)。词法分析器,另一方面,很容易地正确写(如果不是紧凑的),并且非常容易测试。考虑找字母数字标识符。写这个正则表达式不太难(像”[a-zA-Z][a-zA-Z_0-9]*”),但是写作一个简单的循环真的不难。然而,循环的性能将会更高,并且涵盖的代码要少得多。正则表达式库是一个大东西。使用一个解析标识符就像使用一辆麦克卡车去商店买牛奶。并且当我们要调整我们的lexer来允许其他字符类型,如Unicode标识符,并规范化出来,等等,手写循环可以很容易地处理,但正则表达式的方法就会有问题。
类似的论点也适用于语法分析。使用正则表达式来探索解析状态以找到前向的方法是昂贵的,过度的,容易出错的。标准的词法分析、语法分析很容易编写,因此一般而言,适应性很强,没有理由使用正则表达式。他们还导致更快、更安全、更紧凑的实现。
以另一种方式来看,词法分析和语法分析是匹配静态定义的模式,但是正则表达式的特长是提供一种动态表达模式的方式。他们在文本编辑器和搜索工具中非常出色,但是,当你在编译时就知道所有要查找的内容时,正则表达式提供了远远比你需要的更多的通用性和灵活性。
最后,关于写好(write well)这一点上。根据我的经验,正则表达式是被广泛误解和滥用的。当我做涉及正则表达式的代码审查时,我修改了大量的在代码中的正则表达式部分,远高于做正常语句的审查。这是一个误用的标志:大多数程序员(没有手指指向这里,只是观察一般性)只是不知道它们是什么或如何正确使用它们。鼓励将正则表达式作为所有文本处理问题的灵丹妙药,不仅是懒惰而且差的工程,而且强化了不应该使用它们的人使用正则表达式。
所以不要用正则表达式来编写词法分析器和语法分析器作为起点。你的代码将更快,更干净,更容易理解和维护。
Regular expressions in lexing and parsing(翻译)的更多相关文章
- Regular Expressions --正则表达式官方教程
http://docs.oracle.com/javase/tutorial/essential/regex/index.html This lesson explains how to use th ...
- PCRE Perl Compatible Regular Expressions Learning
catalog . PCRE Introduction . pcre2api . pcre2jit . PCRE Programing 1. PCRE Introduction The PCRE li ...
- 8 Regular Expressions You Should Know
Regular expressions are a language of their own. When you learn a new programming language, they're ...
- 转载:邮箱正则表达式Comparing E-mail Address Validating Regular Expressions
Comparing E-mail Address Validating Regular Expressions Updated: 2/3/2012 Summary This page compares ...
- Regular Expressions in Grep Command with 10 Examples --reference
Regular expressions are used to search and manipulate the text, based on the patterns. Most of the L ...
- [Regular Expressions] Find Plain Text Patterns
The simplest use of Regular Expressions is to find a plain text pattern. In this lesson we'll look a ...
- [Regular Expressions] Introduction
var str = "Is this This?"; //var regex = new RegExp("is", "gi"); var r ...
- Introducing Regular Expressions 学习笔记
Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...
- [转]8 Regular Expressions You Should Know
Regular expressions are a language of their own. When you learn a new programming language, they're ...
随机推荐
- Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...
- MFC中小笔记(三)
10.在添加新Menu之后,代码中 调用 创建的IDR_MENU1,一直出现 Debug Assertion Failed的情况.原因是,没有写入到 项目.RC中,需要更新下rc(资源文件). 然后进 ...
- SQL Server学习之路(二):主键和外键
0.目录 1.定义 1.1 什么是主键和外键 1.2 主键和外键的作用 1.3 主键.外键和索引的区别 2.主键(primary key) 2.1 通过SSMS设置主键 2.2 通过SQL语句设置主键 ...
- 深入常用CSS声明(一) —— Background
一直对一些自己常用的css声明掌握得不是很全,只知道常用的一些属性和值,但是对于其他的用法确实一知半解,这篇文章旨在扫盲,先不说有多深的理解,至少做到能够看到这些声明的属性和值的时候做到不陌生. 这里 ...
- jmeter接口系列:时间戳、加密
JMeter安装配置 从官网下载JMeter的软件包apache-jmeter-x.x.zip,下载完成之后解压打开jmeter.bat即可. 说明 这里使用的jmeter版本是3.0,jdk版本是j ...
- Django使用遇到的各种问题及解决方法
从Django的 搭建开始,遇到的问题就不断,网站还没有发布,就出错了,我查了好多资料,啃得了不少东西,也没有找到合适的方法,终于没办法了,自己硬着头皮往下读,终于解决了这些问题,下面分享给大家. 代 ...
- MERGE语法详解
merge语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入. 其基本语法规则是 merge into 目标表 a using 源表 b on(a.条件字段1=b.条件字段1 and a ...
- Secret 的使用场景 - 每天5分钟玩转 Docker 容器技术(109)
我们可以用 secret 管理任何敏感数据.这些敏感数据是容器在运行时需要的,同时我们不又想将这些数据保存到镜像中. secret 可用于管理: 用户名和密码. TLS 证书. SSH 秘钥. 其他小 ...
- TP3.2.3 接入银联支付
TP3.2.3 接入银联支付 项目接入银联支付的过程, 在此记录下,希望能帮助开发盆友平坑. 银联SKD链接:https://open.unionpay.com/ajweb/product/newPr ...
- redis的hash类型
1.简单描述 hash是一个string类型的field和value的映射表.添加和删除操作都是O(1)(平均)的复杂度.hash类型特别适合用于存储对象.在field的数量在限制的范围内以及valu ...