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

(英文原文来自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. 利用阿里云Centos7建站过程

    以下可能不尽详述,如有问题欢迎指出 准备过程:1. 阿里云主机一台2.域名一个 3.github个人帐号开始: 1.以root帐号登录云主机 2.安装apache [root@192 ~]# yum ...

  2. Android开发之漫漫长途 番外篇——内存泄漏分析与解决

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. PHP提高网站性能的一些方法

    前段时间面试问到了这个问题,回答的不是很全面,就去问了度娘,得到了一些比较全的答案,由于出处较多就没法确定原文出处了.下面是分享的答案. 一.大型网站性能提高策略: 大型网站,比如门户网站,在面对大量 ...

  4. 关于C++编译链接和模板函数

    一,关于编译链接编译指的的把编译单元生成目标文件的过程链接是把目标文件链接到一起的过程编译单元:可以认为是一个.c或者.cpp文件.每个编译单元经过预处理会得到一个临时的编译单元.预处理会间接包含其他 ...

  5. 浅copy 与 深copy

    import copy names = ["zhangyang", 'guyun', 'xiangpeng', ['jack','tom'], 'xuliangchen'] nam ...

  6. linux服务器解压缩文件的命令

    尝试去好好用linux.新手起步.   这边只会提到我用过的.其他相关的以后我用到了我会补充的.如果有错欢迎指正 注:1.c-创建-create 2.v-复杂输出    3.f-文件-file     ...

  7. 大白话Vue源码系列目录

    .first-level{ font-size: 1.2rem; cursor: default; color: #666; } .second-level{ font-size: 1.1rem; p ...

  8. URI和URL差别以及相对路径和绝对路径的差别

    一.URL和URI定义: 1.URL是全球资源定位符的英文所写,您平时上网时在IE浏览器中输入的那个地址就是URL.比方:网易 http://www.163.com就是一个URL. 2.URI是Web ...

  9. javascript跳跃式前进(3) - 跳入JSON

    前言 JSON崛起不是意外,是顺应时代;相当简洁小巧的书写模式及阅读方式; 基础 看这篇文章: JSON知识点汇总_W3SCHOOL 初步进阶 早期的解析仅仅实用eval() ,可是这货太easy给注 ...

  10. 在Laravel中使用swoole来取代nginx作为http服务器

    1.是什么限制Laravel框架的速度? Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次 ...