正则表达式是否用于构建解析器?

2024-05-11

这只是出于好奇的一个问题,因为我最近需要越来越多地解析和使用正则表达式。似乎,对于我在搜索中遇到的有关某种解析的问题,有人总是最终说,当问一些与正则表达式相关的问题,“正则表达式对此不好,请使用这样那样的解析器”...因为我已经更好地理解了正则表达式,我认为大多数东西都是可能的,只是它相当复杂且耗时,因为你必须考虑许多不同的可能性,当然,它必须与条件语句和循环结合起来才能构建任何类型的解析器..所以我想知道正则表达式是否用于构建大多数解析器或者是否还有其他一些正在使用的方法..我只是想知道,因为我可能需要构建一些相当复杂的自定义解析器,但不一定有现有的解析器可供使用。

感谢您提供任何信息,因为我似乎无法找到此问题的直接答案。


通常,您将使用两种(至少)类型的工具来构建解析器。

第一部分是词法分析——将字符分成标记并过滤掉注释和空格。该部分通常使用正则表达式完成。嗯,更典型的是使用扫描仪生成器来完成,该生成器将正则表达式和代码对的集合转换为程序,该程序在识别正则表达式时执行相应的代码。事实证明,这比每次测试每个正则表达式更有效,并且由于各种其他原因它也更有效。 FLEX 是 C 语言中的常用工具。

解析器的第二部分是语法。最典型的工具是另一个程序生成器,它接受上下文无关语法(CFG),该语法注释有用于解释组件“词性”的规则。 CFG 能够表达诸如平衡括号之类的内容,而正则表达式则不能(除非它已使用 CF 功能进行了扩展,使其在数学意义上不是严格的“正则”)。但是带有规则的 CFG 非常好,因为您可以为语言的短语结构附加语义。 BISON是C语言中这部分的常用工具。

但我实际上告诉了你一个小谎言。您会看到,每种真正的编程语言都有无法在上下文无关框架中表达的部分。例如,您需要将变量的定义与其使用联系起来,以便您知道要生成哪些指令,以及对其进行的操作是否合法。这通常被认为超出了解析的范围,但有一些诸如“属性语法”之类的东西,它们就像扩展了 CFG 的功能,甚至可以使这些上下文依赖关系更容易编码和使用。

现在,没有任何规则规定您必须使用此类工具。许多简单的语法很容易使用手写工具进行处理。例如,LISP 的 S 表达式可以简单地扫描为:

如果以数字开头,则读取数字。 如果它以字母开头,请读取一个符号。 如果是空格,则跳过它。 如果它是一个左括号,则跳过它,递归此例程以获得一个值,并期望一个右括号。

嗯,对于字符串和其他东西来说还有一些复杂的情况,但这就是基本的想法。解析 FORTH 甚至更简单,因为它不构建递归数据结构。

不管怎样,无论你的项目是什么,这都会让你继续下去。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式是否用于构建解析器? 的相关文章

  • 有没有办法缩短这个正则表达式?

    以下正则表达式适合我的模式 但是 我想知道是否有办法缩短它 我不能使用 w 因为我只想要不区分大小写的英文字母 因为该模式重复 所以我想知道是否可以将其分组 如果可能的话 A Za z 5 A Za z 3 A Za z 3 A Za z
  • python 文件中的单词分析和评分

    我正在对一个句子进行逐字分析 例如 嘿那里 这是一部很棒的电影 我有很多像上面这样的句子 我有一个巨大的数据集文件 如下所示 我必须快速查找该单词是否存在 如果是 则进行分析并存储在字典中 例如从单词的文件中获取分数 句子最后一个单词的分数
  • 正则表达式仅匹配字母数字和连字符,删除 javascript 中的其他所有内容

    我想删除除字母数字和连字符之外的所有内容 到目前为止 我已经得到了这个 但它不起作用 String String replace a zA Z0 9 ig 有什么帮助吗 如果要删除除字母数字 连字符和下划线之外的所有内容 请否定字符类 如下
  • 如何使用 PHP preg_replace 链接 Twitter 用户名?

    我想搜索我的 Twitter 状态对象的文本属性并将 username 替换为 a href username a 到目前为止我尝试过的看起来像这样 pattern 1 a zA Z0 9 replace a href 1 2 a new
  • 是否可以基于正则表达式模式生成示例字符串?

    在我的应用程序中 用户可以在文本框中输入他自己的正则表达式模式 以便他可以强制另一个用户 文本框进行特定输入 用户是否可以看到与他输入的正则表达式匹配的字符串示例 例如 如果他要输入 A Z 2 它会生成一个像 XX 向用户表明他只能输入两
  • JavaScript 和正则表达式:文字语法与正则表达式正则表达式对象

    我在这段小 JavaScript 代码中遇到了一些麻烦 var text Z Test Yeah Z With literal syntax it returns true good alert Z s S Z g test text Bu
  • 正则表达式:如何匹配所有大于 49 的数字?

    我对正则表达式有点陌生 正在为正则表达式的数量字段编写验证need要使用的 如何匹配所有大于或等于 50 的数字 I tried 5 9 0 9 但这只匹配 50 99 有没有一种简单的方法来匹配所有可能大于 49 的数字 仅使用整数 事实
  • 标记(lex?parse?)正则表达式

    使用 Ruby 我想获取一个 Regexp 对象 或表示有效正则表达式的字符串 您的选择 并将其标记化 以便我可以操作某些部分 具体来说 我想采用这样的正则表达式 字符串 regex var w parts foo bar 并创建一个替换字
  • 正则表达式会减慢程序速度

    我正在尝试创建一个程序来解析游戏聊天日志中的数据 到目前为止 我已经设法让程序运行并解析我想要的数据 但我的问题是程序变得越来越慢 目前解析 10MB 文本文件需要 5 秒 我注意到如果我将 RegexOptions Compiled 添加
  • 从字符串中提取数字 (Regex C++)

    假设我有一根绳子S 1 this is a number 200 Val 54 4class find57 我想用Regex仅提取这些数字 num 1 1 num 2 200 num 3 54 而不是 4class 中的 4 或 find5
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • 正则表达式接受 4 条规则中的 3 条

    我似乎无法让正则表达式正确满足以下要求 长度在 8 到 20 之间的字符串 必须包含至少 1 个大写字母字符 至少 1 个小写字母字符 以及至少 1 个数字或至少 1 个特殊字符字符 或两者 假设特殊字符仅限于包括 我最初是这样写的 A Z
  • 我可以缩短这个正则表达式吗?

    我需要检查字符串是否符合特定的 ID 格式 ID的格式如下 aBcDe fghIj KLmno pQRsT uVWxy 由五个大写或小写字母组成的五个块的序列 由一个破折号分隔 我有以下有效的正则表达式 string idFormat a
  • 未排序模式的 boost::Spirit 语法

    我有一个需要解析的模型模式的一部分 可以说它看起来像下面这样 type Standard hostname x y z port 123 属性是 元素可能看起来无序 属于架构一部分的所有元素都必须出现 而不是其他元素 所有元素的综合属性都进
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 正则表达式匹配整个单词[重复]

    这个问题在这里已经有答案了 我在 stackoverflow 上看到了很多关于使用正则表达式进行全词匹配的例子 我有以下情况 我想用 www xyz com 替换 www abc com string RetVal I am going t
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • 如何使用 XPath 正则表达式匹配 URL

    需要 XPath 方面的帮助 我有这样一个XML
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望

随机推荐