- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正则表达式是用于解析多种语言的字符串的标准工具。但是,它们的适用范围受到限制。正则表达式只能匹配列表。无法使用正则表达式描述任意的深层嵌套结构。问题:什么是可以与树结构匹配(产生AST)的,被广泛使用/传播并且与常规实验一样标准的技术/框架。
最佳答案
正则表达式描述了有限状态自动机。
自1960年代后期以来,解析的“面包和黄油”(虽然不一定是“最新技术”)已经成为解析器生成器根据LALR(1)等“LR”算法生成的下推式自动机。
与正则表达式的联系是这样的:实际上,解析机确实使用与正则表达式非常相似的规则来识别可行的前缀。 “核心LR(0)项”之间的“移位”状态转变构成了有限的自动机,并且可以由正则表达式来描述。由于执行“移位”时将符号推入堆栈并删除它们(“减少”)的语义作用,可以处理递归。约简重写了堆栈的一部分,并执行“转到”到另一个状态。正则表达式自动机中不存在这种goto和堆栈。
语法分析语法也与正则表达式有关。正则表达式本身可以赋予递归。首先,我们可以接受一些正则表达式并为其命名,然后通过编写调用这些名称的表达式来构造更大的正则表达式。 (就像在lex
工具中找到的功能一样,您可以在其中定义诸如letters [A-Za-z]+
之类的命名表达式,以后再将其称为{letters}
。现在假设您允许使用循环引用,例如letters [A-Za-z]{letters}?
。您现在具有递归;唯一的问题是调整模型为了实现它。
实际上,各种现代语言和环境中所谓的“正则表达式”的实现都支持递归。例如,Perl兼容的正则表达式(PCRE)支持它。
经典NFA编译路径(可能转换为DFA)不处理具有递归或后向引用功能的表达式;他们不可能。
上面的letters
递归如何处理与实际的递归有关。 ?
运算符可以实现为尝试匹配其各自参数对象的函数。如果成功,那么它将消耗与其匹配的任何东西,否则将不消耗任何东西。也就是说,正则表达式可以转换为语法树,并按“原样”进行解释,而不是编译为状态机(或琐碎地编译为与树的节点相对应的函数),并且这种解释自然可以处理递归。然后,该解释有效地构成了语法指导的递归下降解析器。 (请注意,在定义letters
以使该示例与此方法兼容时,如何避免左递归)。
示例:括号匹配的正则表达式:
par-match := ({par-match})|
branch-op <-- "par-match" name points at this node
/ \
catenate-op <empty>
/ \
"(" catenate-op
/ \
{par-match} ")"
(())
。左侧
catenate-op
将依次调用其左侧子树,该子树匹配并使用左侧括号,剩下
())
。然后它将调用其右子树另一个
catenate-op
。此
catenate-op
匹配其左子树,后者通过命名的
par-match
引用触发递归到顶层。该递归将匹配并使用
()
,而保留
)
。然后,
catenate-op
调用与
)
匹配的右子树。控件最多返回
branch-op
。 (尽管
branch-op
的左侧与某项匹配,但
branch-op
仍必须尝试另一种选择;一个以上的分支可以匹配,某些分支可以比其他分支更长。)
(?name:definition)
,这意味着“匹配
definition
可以通过
name
包含其自身的调用。调用语法可以是
(*name)
,因此我们可以将
par-match
的示例写为
(?par-match:\((*par-match)\)|)
。
(?
和
(*
的组合在下面无效“经典”正则表达式语法,因此我们可以使用它们进行扩展。
S -> A | B
B -> b
A -> A a | c
A -> A ...
递归,但这仍然是常规的,并且对应于regex
ac*|b
,这只是表示相同语言的一种更紧凑的方式。语法使我们可以标注非常规的语言,并且无法为其编写正则表达式,但是正如我们所看到的,我们可以扩展正则表达式的符号和语义来表达其中的某些内容。正则表达式与语法不是分开的。两者不是对应的,而是一个是特殊情况或另一个的子集。
关于regex - 用于解析嵌套结构的正则表达式的对应部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31927605/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!