问题标签 [ragel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么 Ragel 会执行两次 to-State 和 From-State 动作?
我正在测试 Ragel 中状态动作的功能。我有以下 Ragel 程序:
ragelScaffolding.rl:
我希望这会输出以下内容:
但相反,它输出:
这告诉我它两次运行这些操作。我一直在思考为什么会出现这种情况并阅读文档,但我似乎无法弄清楚为什么会发生这种情况。这发生在使用 Ragel 6.9 和 7 编译(以及使用 gcc 编译 C)时。该文档说明了以下内容:
当状态机进入指定状态时,状态动作就会被执行,要么是通过转换的自然移动,要么是通过基于动作的控制转移,例如 fgoto。它们在转换中的动作之后但在当前字符前进并针对输入块的末尾进行测试之前执行。
但是其中没有关于执行两次操作的内容。我非常感谢您对此事的任何帮助或澄清。
提前致谢。
c - 我的第一杯 Ragel
我正在编写我的第一个 Ragel 程序。我的目标是写一个四函数计算器。请不要把你的代码发给我。这对我来说是一次学习经历。
我想要做的是将正则表达式与浮点数匹配并打印出值。Ragel 程序和 C/CPP 代码可以编译,但我的返回值始终为零,并且打印语句永远不会执行。下面是我的代码。我做错了什么?
go - 任何可以在 Go 中处理递归语法的解析器?
在一个 Node.js 项目中,我在 ANTLR4(JS 目标)中编写了一个查询解析器。用户查询具有简化的类似 SQL 的语法,然后在服务器上处理为完整的 SQL。查询结构可以任意嵌套。
我现在正在移植这个应用程序。目前,没有 ANTLR4 目标。我开始探索Ragel,但根据文档,它需要常规语法并且不处理递归,除了平衡括号等非常简单的任务。
另一个解决方案是将我的 ANTRL4 语法与 C++ 目标一起使用,然后将 C++ 类链接到 SWIG(或其他东西),这感觉有点毛茸茸,是最后的解决方案类型。
另一种解决方案是在客户端进行解析,但这会增加客户端下载所需的 js 数量。也觉得有些无奈。
所以我的问题是:
1) 是否有任何解析器库能够处理 Go 中可用的递归语法?
2)我对 ragel 完全不熟悉,因为它似乎是一个相当复杂的工具,我想在投入时间学习它之前弄清楚这一点:有没有办法在 ragel 中处理一些递归(比如达到一定水平),如果语法够简单吗?
c# - 使用带有流输入的 Ragel 来检测 URL?
我需要在排版期间有效地检测输入流中的 URL。
URL 检测器将成为排版流程的一部分。它应该一次接受一个字符作为输入,并且一次应该输出一个字符以及该字符所属的 URL。它可以为前瞻缓冲文本以执行此操作。
例如,如果输入流是"Hello http://foo.com World"
,则输出应该是:
可以根据需要让 Ragel 流式传输输入和输出吗?
顺便说一句,这里有一个 (Java) ragel URL 解析器,我正在考虑将其用作起点。
c - fbreak 的 Ragel 替代品;但没有提前到下一个符号?
我正在编写一个程序来解析 HTML 以使用 Ragel 从那里提取 URL。
找到 URL 后,我需要对其执行一些操作,然后准备处理下一个 URL。
所以我需要在 URL 端停止执行主循环,在解析器之外执行一些操作,然后从我中断的地方开始。
fbreak
似乎是一个很好的变体,但不幸的是它吃了缓冲区中的下一个符号。除了可能已经存在缓冲区结束之外,这里的问题是我们有效地跳过了输入流中的一个符号。
有没有一种方法可以中断执行而不提前到输入流中的下一个符号,就像fbreak
那样?
到目前为止,我发现只有脏 hack 可以写goto _out;
而不是 fbreak。
parsing - 捕获不明确的文本段的最佳方法是什么?
在以下情况下捕获内部文本的最佳方法是什么?
问题是,由于 inner_text 可以 match ,该动作似乎cdata_end
触发了多次]
。
ragel - Ragel Parse Key Value Pairs without delimiter for EOF
所以我有一个简单的字符串,希望能通过 ragel 状态机运行。
键1=值1;键2=“值2”;键3=值3
这是我的 ragel 的简化版本
我遇到的问题是在最后一个键/值对之后我永远不会有分号,所以我希望它是可选的,但是当我这样做时,状态机会为该值找到几个补丁。是否有某种语法我可以说 pair 必须以 a 结尾(";" | *eof*)
?
我确实改变了,我的主线对此,但它似乎是一个黑客,并不能真正适用于我想用这个状态机做的其他一些事情。
html - 使用 ragel 解析 HTML 的问题
在我的项目中,我需要从 HTML 文档中提取链接。为此我准备了 ragel HTML 语法,主要基于这项工作: https ://github.com/brianpane/jitify-core/blob/master/src/core/jitify_html_lexer.rl (这里提到:http:// ragel-users.complang.narkive.com/qhjr33zj/ragel-grammars-for-html-css-and-javascript)
几乎所有工作都很好(感谢伟大的工具!),除了一个我迄今为止无法克服的问题:
如果我将此文本指定为输入:
我的解析器可以正确提取第一个链接,但不能正确提取第二个链接。它们之间的区别在于'bbbb'
and之间有空格,而 and'<a'
之间没有空格。'cccc'
'<a'
通常,如果任何文本(空格除外)在'<a'
标记之前存在,它会使解析将其视为内容,并且解析器不识别标记打开。
请在此 repo 中找到:https ://github.com/amdei/ragel_html_sample有意简化语法示例,旨在作为 C 程序 (ngx_url_html_portion.rl) 工作。还有输入文件 input-nbsp.html ,预计将包含应用程序的输入。
为了使用它,请从语法制作 .c 文件:
然后编译生成的 .c 文件并运行 programm。
输入文件应位于同一目录中。
将真诚地感谢任何线索。
c - 如何在 Ragel 中编写我自己的错误
拉格尔很容易。但是我如何编写自己的错误函数呢?
我使用循环: main := |* *|;
如果我得到其他数据,我需要执行我的操作?以及当我的标记语法好但语义不好时如何出错。
ragel - 带有可选空格的简单 Ragel 语法
Ragel 是强大的机器,但我在语法中的“可选”元素方面遇到了麻烦。我有简单的数字或字符串。问题在于空格。我不知道如何在“,”和变量之间正确放置可选空格。Enter 将在令牌之间的每个位置。结束行是';' 或进入。我需要使用 $err() 函数来解决错误。
这是我的测试集:好
输出:
线(这个,是,一个,测试)
线(和,这个,是,好的)
行(下一个,麻烦)
生产线(如何,生产,好)
行(语法)
线(好的)
并且失败(这不是=没有',')(',,'没有数字或变量)
当我使用这个语法时,我在行尾得到单独的字符或错误