问题标签 [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 回答
111 浏览

eof - 如何匹配文件结尾?

我想将换行符 ("\n")、分号 (";") 或 eof 匹配为有效的语句结尾。前两个很明显,例如

但我不确定如何以同样的方式匹配 eof 。

有什么方法可以匹配eof吗?我想知道是否empty可行,但我不确定如何使用它。

0 投票
1 回答
274 浏览

go - What is the correct way to use a stack with a scanner block in Ragel?

I'm using Ragel 6.10 with Go. I'm sure it's likely an issue with my code but I'm getting some weird errors when I try to use a stack with a scanner block. I'm trying to setup bracket matching and my code looks roughly like this;

Looking at page 46 in the guide it looks like this should be possible. When I run Ragel ragel -G2 -Z main.rl. I get the following error when I try to compile (it only happens for -G2 FSM generation);

Commenting out the fret line removes the error and warns postpop and prepush are unreachable.

The full code is here;

https://github.com/nfisher/gir/blob/broken/graphql_collections.rl#L47

A working minimal test-case is here;

https://gist.github.com/nfisher/649ca816f82bb3ccd7164331ac2324ac

Error for test-case;

0 投票
1 回答
100 浏览

ragel - 为任何已知长度的数据优化 Ragel 语义条件

Ragel 手册6.5 Semantic conditions中有一个示例,该示例演示了如何使用when子句为可变大小结构编写语法。

它适用于小型结构,但是对于较大的结构,它会减慢速度,因为解析器会尝试评估每个字符的条件。

我想要做的是跳过扫描并将数据复制到缓冲区中,对于这样的语法(注意any*):

所以我想直接复制长度为n的缓冲区而不需要迭代。如何在不离开解析器上下文的情况下做到这一点?

0 投票
1 回答
203 浏览

regex - 使用 Ragel 在 Golang 中的两个正则表达式的交集

该函数的模板如下:

我正在尝试使用 Ragel 来获取两个正则表达式的交集。不过,不确定 Ragel 是否是正确的工具。我最后的手段是实现从正则表达式到 DFA 和 DFA 到正则表达式的转换,以及我自己的两个 DFA 的交集,但我宁愿避免这种情况。非常感谢任何可靠的库来解决这个问题。

0 投票
1 回答
189 浏览

go - Ragel 转换动作和状态动作之间的区别

状态机、术语和工具对我来说都是新的,尽管我最近一直在尝试用各种在线资源来围绕它们。这开始于我想在 Ragel 和 Go 中构建一个比正则表达式更快的解析器。我对Ragel 文档的第 3 章感到困惑,其中涵盖了行动。

我不清楚与状态转换相关的操作与状态本身之间的区别是什么。这些示例仅对状态嵌入操作有错误,因此我不确定您何时会使用toandfrom运算符。我做了一个简单的例子:

输出以下内容,这是我所期望的:

但是,如果我使用相同的周围代码将它们替换为状态嵌入操作:

main := "foo" >~fooStart %*fooEnd "bar" >~barStart %*barEnd "baz" >~bazStart %*bazEnd;

我得到以下输出,其中的顺序和缺失的行对我来说没有意义:

我最初的印象是,当您只想在整个状态机中的某些点运行操作而不是更细粒度的转换时,使用状态嵌入操作。这仍然让我对它们的执行顺序感到困惑,以及为什么不执行“foo”的启动“to-state”操作。

所以我的问题是,使用状态操作而不是转换操作有哪些实际原因或示例?用外行的话来说,它们的工作方式有何不同?

这是状态嵌入操作的图表。 状态嵌入动作

0 投票
1 回答
67 浏览

ragel - 在 ragel 中扫描“引用字符串”的正确方法是什么?

我正在尝试使用 go 学习 ragel,但我无法找到扫描引用字符串的正确方法

这是我定义的

以下带有单引号字符串的表达式可以正常工作

如果我扫描上述条件,那么我会得到这个 printf

带引号的字符串:“xyz.123”

但是,如果我有 2 个带引号的字符串,如下所示,它会失败

它扫描引用的字符串

带引号的字符串:“0003”{如果xyz ==“5003”

有人可以帮我吗?如果有更好的选择

我正在使用以下版本

0 投票
1 回答
46 浏览

ragel - 使用 Ragel 从 ES6 模板文字中提取标记

JavaScript 包含以下语法:

我想知道 Ragel 机器如何拆分上面的语法。在我看来,右花括号的类型取决于解析状态。例如,在下面的代码中,大括号是字符串标记的一部分,因为${标记不存在:

最后,当您考虑在变量表达式本身中也可以找到正确的卷曲时,它变得更加棘手,即:

Ragel 如何实现类似的上下文相关语法?

0 投票
1 回答
201 浏览

go - How to implement regex /cat[s]?(\b|$)/ with ragel correclty?

I want to speed up my program written in Go and convert regular expressions to finite state machines with ragel. I cannot figure out how to match end of input correctly when converting regular expressions similar to /cat[s]?(\b|$)/ (it matches a word border or end of input), so I made this workaround:

Finite State Machine Graph

the output is correct:

I do think there is a better way though. What is a "proper" way to handle end of input with ragel?

0 投票
1 回答
29 浏览

regex - Ragel:如何通过匹配不同的表达式来返回不同的值

我正在寻找一个通过匹配不同表达式的输入字符串来返回不同整数值的函数。

这是它可能的方式,但语法:

有人可以请教吗?

0 投票
0 回答
27 浏览

regex - 拉格尔:回到不应该的状态

有以下 Ragel 正则表达式:

这里假设如果字符串包含表单的子字符串S = '<123',那么我们需要切换到消息将被捕获到该子字符串的状态S

以及以下 Ragel 动作:

输入字符串: "IKWMC71:03138808,msu=816688275211201112\n<13"

日志显示以下内容:

如您所见,在到达 substring 之后S,FSM 再次返回到 action on_host_info。为什么?如何确保机器不返回on_host_info