问题标签 [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.

0 投票
1 回答
290 浏览

parsing - Ragel - 如何一次返回一个令牌

我想构建一个每次调用一个令牌的 ragel 语法/事物。

我对 Ragel 比较陌生(但对编译器等并不陌生)。

我已经为类似 json 的符号(三层深)编写了一个语法。它发出 C 代码。

我的输入是完整的字符串(无需跨越缓冲区边界)。

我想用输入字符串调用我的语法,让语法返回一个标记。然后再次调用它并让它返回下一个令牌,依此类推。直到字符串结束。然后,使用新字符串再次调用。

有人会认为状态机非常适合这种行为,但我还没有弄清楚如何在 Ragel 中实现这一点。

0 投票
1 回答
379 浏览

state-machine - Ragel:如何匹配其他东西无法匹配的所有内容?

我已经使用 Ragel 实现了一个非常简单的解析器。“主要”结构是扫描仪。

我有这样的实现:

我如何匹配其他规则不匹配的所有其他内容(即基本上是错误条件,某种格式错误的输入)?我想实现它以便能够在格式错误的输入所在的行上得到错误。我尝试在扫描仪末尾使用“任何”条件,但这当然不起作用,因为这将始终是“最长匹配”,因此扫描仪每次都会匹配它。我绝对不想从包含所有其他标记的列表中进行某种否定(以将它们从“任何”中排除),因为这听起来是错误的(难以维护并且最终成为带有许多标记的大块代码) . 如何在 Ragel 的扫描仪中匹配与其他东西不匹配的所有其他内容?

编辑:做了一些测试,如果我在扫描仪末尾匹配“任何”,我就可以让它工作。然后,当字符不匹配时,它将转到该表达式。但是,如果我尝试匹配“any+”,那么它将不起作用,因为它每次都会去那里(对于所有数据,它始终是扫描仪中最长的匹配项)。仅匹配“任何”的问题是我没有将令牌开始和令牌结束指针指向整个不匹配数据的连续块。如何匹配“不匹配任何其他字符的最长连续字符块”?

0 投票
1 回答
361 浏览

ragel - 基本 Ragel 解析器

使用这样的机器:

主要:=(任何+);

当我向它提供超过 1 个字节的数据块时,它似乎只消耗 1 个字节,然后(通常)出现 %%write exec 块。我希望它是贪婪的并消耗所有提供的输入。

我总是可以在 %%write exec 之前检查 p < pe 和 goto,但它似乎很老套。

我如何让它“贪婪”?

0 投票
3 回答
1211 浏览

c - C 的有限状态机编译器来模拟网络协议

我一直在寻找一个好的状态机编译器来测试一些自定义网络协议。我已经查看了一些工具,例如 Yakindu、Ragel(编译器)、SCXML(语言),但我不确定它们是否可以用于网络协议。

SCXML(language) 看起来不错,但我找不到任何专门用于 C 的编译器(scxmlcc 用于 C++)。有谁知道基于 SCXML 的 C 编译器?Yakindu 工具看起来很有希望,但我不确定是否可以测试 BGP/OSPF 等网络协议。任何人都可以请给出任何指示吗?Ragel 看起来也不错,但我再次不确定是否可以使用此编译器生成复杂的网络协议客户端。

我特别提到网络协议的原因是,我还希望能够在“事件”发生后执行自定义例程,例如 packet_create/packet_send(具有自定义数据包大小)等,作为“操作”的一部分。

我是否需要始终从状态图中生成代码,或者有没有办法直接与状态交互?我对 FSM 很陌生,任何帮助/建议/建议/链接都将不胜感激。

0 投票
1 回答
188 浏览

ragel - 发生解析错误时打印 Expected Token Type XXX

我希望能够使用 Ragel => Parsing error found at position line:col, Integer 来打印此错误消息。

拉格尔有可能吗?

此致

0 投票
1 回答
101 浏览

lexer - Ragel中列计数的每个字符操作

在 Ragel 有限状态机中实现列计数器的首选方法是什么。如果有什么不同的话,我的主机是 Ragel 手册第 6.3 章中定义的扫描仪。我可能在想我只需要能够为每个消耗的角色执行一个动作(即增加一个计数器),但如果有更好的方法来做到这一点,我很想知道。

0 投票
1 回答
111 浏览

ragel - Ragel:避免“when”子句函数的冗余调用

我正在为相当简单的二进制协议编写 Ragel 机器,我在这里展示的是更加简化的版本,没有任何错误恢复,只是为了演示我要解决的问题。

所以,这里要解析的消息是这样的:

机器外观如下:

如您所见,首先我们收到代表长度的 1 个字节;然后我们接收data字节,直到我们收到所需的字节数(检查由 完成is_waiting_for_data),当我们收到下一个(额外)字节时,我们检查它是否是正确的校验和(由is_checksum_correct)。如果是,机器将等待下一条消息;否则,这个特定的机器会停止(为了简化图表,我没有故意在这里包含任何错误恢复)。

它的示意图如下所示:

点击查看图片

如您所见,在状态 1 中,当我们接收用户数据时,条件如下:

因此,在它冗余调用的每个数据字节上is_checksum_correct,尽管结果根本不重要。

条件应该很简单:0..255(is_waiting_for_data)

如何做到这一点?

0 投票
2 回答
325 浏览

ragel - ragel的源代码库在哪里

原来的地址 git://git.complang.org/ragel.git 已经失效了。谷歌搜索只显示来自旧代码的非官方存储库。

既然它的开发现在在 Colm Network 下,Colm Networks 还会开放它的开发库吗?

0 投票
1 回答
404 浏览

c++ - 是否可以在一个 Ragel 文件中调用多台机器?

我正在创建一个相当简单的解析器,它没有递归结构或任何太具有挑战性的东西。

我想做的是当我遇到“命令”时,我想调用一个单独的解析函数(用宿主语言),例如 parseCommandType1 ,然后根据命令有一个单独的返回类型等。然后该函数将调用它自己的 Ragel 机器来解析命令的内容。

如果我想在一个 Ragel 解析器中完成所有这些,那么逻辑很快就会变得非常难看,因为根据命令类型,我需要以不同的方式解释数据并创建一些不同类型的派生对象。

“子机”也非常简单,其中会有很多,所以我绝对不想将它们拆分为单独的文件。我正在尝试清理的当前实现有 200-300 行,因此将其拆分为十个文件似乎有点不方便。

所以问题是我可以在一个文件中以某种方式调用/创建/实例化多个 Ragel 机器吗?这些机器可以有一个名称,但似乎无法调用该名称,只需将其包含在不同的机器上,所以对我来说,看起来每个文件只能有一台机器?

有没有其他巧妙的方法来做到这一点?

0 投票
1 回答
128 浏览

java - Ragel Java 输出 [nulla,b] 而不是 [a,b,c]

我想用 ragel 编写一个 CSVReader 状态机,因为我已经用 Enums 用 Ja​​va 完成了我的工作。返回的列表应该是 [a,b,c] 但我得到 [nulla,b]。我在 Fedora 22 上使用 Ragel 6.8,我真的希望有人能帮助我

这是来源:

这就是它给我的回报: [nulla, b]