词法分析和语法分析中的正则表达式

(英文原文来自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(翻译)的更多相关文章

  1. Regular Expressions --正则表达式官方教程

    http://docs.oracle.com/javase/tutorial/essential/regex/index.html This lesson explains how to use th ...

  2. PCRE Perl Compatible Regular Expressions Learning

    catalog . PCRE Introduction . pcre2api . pcre2jit . PCRE Programing 1. PCRE Introduction The PCRE li ...

  3. 8 Regular Expressions You Should Know

    Regular expressions are a language of their own. When you learn a new programming language, they're ...

  4. 转载:邮箱正则表达式Comparing E-mail Address Validating Regular Expressions

    Comparing E-mail Address Validating Regular Expressions Updated: 2/3/2012 Summary This page compares ...

  5. 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 ...

  6. [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 ...

  7. [Regular Expressions] Introduction

    var str = "Is this This?"; //var regex = new RegExp("is", "gi"); var r ...

  8. Introducing Regular Expressions 学习笔记

    Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...

  9. [转]8 Regular Expressions You Should Know

    Regular expressions are a language of their own. When you learn a new programming language, they're ...

随机推荐

  1. Servlet之过滤器(Filter)和监听器(Listener)

    过滤器 过滤器是一个java组件,可以拦截发送至某个servelet,jsp页面或静态页面的请求,可以在响应发送到客户之前进行拦截 工作原理: 过滤器类必须实现 Filter 接口,包含的方法如下: ...

  2. ##6.2 Neutron计算节点-- openstack pike

    ##6.2 Neutron计算节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.2 Neutron计算节 ...

  3. URL, URI, URN三者区别

    URL和URN都是URI的子集 URL和URN都是URI,但是URI不一定是URL或者URN URI,URL,URN关系图 关于URL: URL是URI的一种,不仅标识了Web 资源,还指定了操作或者 ...

  4. bundles.Add( )下无法绑定后缀为min.css的文件

    1.问题描述: 在绑定css的时候,除了后缀名为.min.css的文件,在render.style()不显示外,其他的css都正常加载, 2.解决办法: 这个是我在调试了几遍之后发现的规律,然后解决办 ...

  5. Etcd全套安装教程

    一.安装 1.1 二进制安装 从这里下载: etcd-v3.2.11-linux-amd64.tar.gz 下载包后解压即可运行: # 解压 tar zxvf etcd-v3.2.11-linux-a ...

  6. 源码安装pipelineDB之CentOS7

    源码下载:https://github.com/pipelinedb/pipelinedb github上面README只要是针对ubunte来安装的. 在正式安装前,要先下载好依赖的包: check ...

  7. Java调用PDFBox打印自定义纸张PDF

    打印对象 一份设置为A3纸张, 页面边距为(10, 10, 10, 10)mm的PDF文件. PageFormat 默认PDFPrintable无法设置页面大小. PDFPrintable print ...

  8. jupyter的交互小工具-----ipyleaflet

    ipyleaflet(一个用于创建简单的交互式地图的平移和缩放的库,ipyleaflet支持诸如多边形,标记和更一般的任何地理编码地理数据结构的注释) from ipyleaflet import M ...

  9. CORS预检请求详谈

    引言 最近在项目中因前后端部署不同地方,前端在请求后端api时发生了跨域请求,我们采用CORS(跨域资源共享)来解决跨域请求,这需要前后端的配合来完成.在这一过程中,后端支持了CORS跨域请求后,前端 ...

  10. 自学Python全栈开发的第二次笔记(Python需要注意的地方)

    好几天没写blog了,今天整理整理.写blog一定要坚持下去.     Python解释器 #!/usr/bin/env python #-*-coding:utf-8-*-   #  无效的内容,只 ...