问题标签 [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 投票
2 回答
2052 浏览

xml - 如何编写一个简单的 Ragel 标记器(无回溯)?

更新 2

|**|原始问题:如果我不需要回溯,我可以避免使用 Ragel's吗?

()*更新的答案:是的,如果您不需要回溯,您可以编写一个简单的标记器。

更新 1

我意识到询问 XML 标记化是一个红鲱鱼,因为我所做的并不是特定于 XML。

结束更新

我有一个 Ragel 扫描器/标记器,它只是在文件中查找 FooBarEntity 元素,例如:

扫描仪版本:

非扫描版本(即使用()*代替|**|

我想通了这一点并在https://github.com/seamusabshere/ruby_ragel_examples上为它编写了测试

您可以在https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_scanner.rlhttps://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizer看到读取/缓冲代码.rl

0 投票
2 回答
625 浏览

regex - 无法将 URL 解析器正则表达式转换为 Ragel

我在 RFC 2396 和 RFC 3986 中找到了一个 URL 解析器正则表达式。

我将其转换为 Ragel:

当我输入绝对 URI 时它就起作用了。

当我输入权限和路径时成功:

但是当我只输入路径时失败:

怎么了?

0 投票
1 回答
988 浏览

c - 如何让 Ragel 解析由 (space* ":" space*) 分隔的两个名称?

我想解析以下内容:

其中名称以 alnum 开头和结尾,并且可以包含 alnum 和空格的任意组合。它们也可以是空白的。我的规则是:

名称可以用冒号分隔,也可以在名称和冒号之间使用空格。我的规则是:

这不起作用,因为显然space*inidentifierspace*insep混淆了解析器。我最终fName会在名称的每个空格中执行操作。

如果我将 sep 更改为:

那么一切都很好。如何修改这些规则,以便解析器执行我想要的操作?

这个问题的源代码在这里:https ://gist.github.com/1661150

0 投票
2 回答
475 浏览

ragel - 匹配文件的开头或换行符 (Ragel)

我使用 ragel 和 C 作为宿主语言。

我可以简单地用'\n'识别换行符,但我需要识别文件的开头作为替代。

在正则表达式的其他实现中,这可以由\Aor给出$,但$保留用于其他目的,'\A'映射到其他东西(警报?)并\A给出解析器错误。

0 投票
1 回答
151 浏览

grammar - RFC 2068 允许评论嵌套在评论中吗?

根据:RFC 2068

通过用括号将注释文本括起来,可以将注释包含在某些 HTTP 标头字段中。仅允许在包含“comment”作为其字段值定义的一部分的字段中使用注释。在所有其他字段中,括号被视为字段值的一部分。

这些是相关的规则:

评论里面的评论?这似乎很愚蠢。我的主张是:(1)评论中不需要嵌套评论。(2) 如果是这样,评论规则最好表述为:

我的主张正确吗?如果没有,嵌套注释何时实际使用?其他图书馆在乎吗?你知道这方面的历史/评论吗?(尝试使用“RFC 2068 嵌套注释”进行 Web 搜索并不是很有帮助。)

(动机:我很在意,因为我正在为 RFC 2068 编写一个词法分析器(使用 Ragel)。如果评论真的需要可嵌套,那就意味着递归规则,据我所知,这不是 Ragel 的最佳选择。我读过一些迹象表明 Ragel 在某些情况下可以处理递归规则,但我不太清楚。另外,我也在查看 Unicorn Ragel 代码,这很有帮助。)

PS 为简单起见,我现在有意不深入研究另一条规则的细节quoted-string

2012-08-20 更新:下面的一个答案有用地引用了 RFC 2068 的较新版本。这有助于澄清解析规则。但是,它没有解决我的其他观点:

  1. 我没有看到任何令人信服的理由让规范在评论中包含评论。这似乎是不必要的——也许是过度设计的,也许是被忽视的。这既烦人又重要,因为递归规则使格式成为非常规语言。这是规范编写者通常应该注意的事情,对吧?

  2. 我还没有(还没有?)看到在评论中使用评论的例子。如果是这样的话,世界已经含蓄地说“嵌套评论无关紧要”。

0 投票
3 回答
2323 浏览

ruby - 平衡括号的简单 Ragel 示例?

这是语法的起点:

(xxxx(oo)()xx)例如,它处理。如何扩展它以允许嵌套组;例如(xxxx(o(x)o)()xx

我知道递归通常不受一台 Ragel 机器的支持。所以这行不通:

来自Ragel State Machine Compiler User Guide (PDF):(为强调而添加了粗体文本):

“一般来说,Ragel 无法处理递归结构,因为语法被解释为常规语言。但是,根据需要解析的内容,有时使用手动编码技术实现递归部分是可行的。这通常适用于递归结构的情况简单且易于识别,例如在括号的平衡中。”

“解析递归结构的一种方法是使用递增和递减计数器的操作,或者以其他方式识别递归结构的入口和出口,然后使用 fcall 和 fret 跳转到适当的机器定义。或者,可以使用语义条件来测试计数器变量。

“一种更传统的方法是在输入递归结构时调用单独的解析函数(以宿主语言表示),然后在识别到结尾时返回。”

关于嵌套括号的邮件列表讨论中,提到了相同的三种方法:

  1. 使用 prepush 和 postpop 指定一个可增长的堆栈,然后使用 fcall 和 fret。

  2. 计数,然后在动作或条件中验证。

  3. 输入递归结构时调用新的解析函数(以宿主语言)。

你能给我举一个例子吗——最好使用我上面的例子——在 Ruby 中?谢谢!

0 投票
2 回答
482 浏览

ragel - 检查 Ragel 是否匹配整个输入

是否有更好的方法要求 Ragel 消耗所有输入?这是我现在使用的:

以上大部分都是样板,除了data.length == p测试。它有效——除了它不验证词法分析器是否以最终状态结束。因此,即使没有成功解析整个输入,我也有一些测试用例可以返回令牌。

有没有更好的办法?

(直接测试最终状态可能会更好。我正在研究如何做到这一点。想法?)

0 投票
1 回答
222 浏览

java - 编译 Ragel 6.7 生成的 java 代码时出错

我正在尝试使用 Ragel 编写一个简单的 Lexer,并将其输出为 Java 有效代码,但生成的代码无法编译。

这是我正在使用的 Lexer.rl:

生成的文件和错误输出在:https ://gist.github.com/3495276 (因为太大,这里贴不上 =S )

那么,我做错了什么?

0 投票
1 回答
310 浏览

ruby - 如何用 Ragel 解决这种歧义?

我正在尝试解析以下格式:(identifier/)?identifier(/keyword)?,带有第一个标识符以及可选的关键字。关键字不能用作标识符。例如,如果up是关键字,则:

  • simple匹配第二个标识符,
  • first/second匹配first作为第一个标识符,second作为第二个标识符,
  • second/upsecond作为第二个标识符和up关键字匹配。

Ragel与 Ruby 结合使用,我定义了以下 FSM:

这给出了以下输出:

这是不正确的,因为第一部分应该是First: first Second: second,但由于:>我给出的优先级而预期。

我尝试了不同的优先级组合,但未能获得预期的结果。有没有办法用 Ragel 解决这个问题(即,这可以在没有前瞻的情况下解决)?

0 投票
1 回答
553 浏览

c - 如何在 Ragel 中实现前瞻

我有两种状态;一个是另一个更一般的状态的特定实例。我相信避免同时进入两种状态的正确方法是使用 k>1 实现前瞻,但我找不到任何如何做到这一点的例子。

Ragle 用户指南说:

在使用 fhold 和 fexec 时,用户必须小心将生成的机器与另一台机器组合在一起,以便调整当前位置的转换不会与来自另一台机器的转换组合。

我不完全确定这意味着什么,除了“不要尝试阅读当前表达式的末尾”。

我的机器是这样的:

我想标记 JPEG 标头,跳过未知段并处理 JFIF 等众所周知的段。JPEG 应用程序段 app0 以0xFFE0. 如果 app0 包含 JFIF 数据,则 app0 标记后跟一个 2 字节长度和字符串“ JFIF\0”。这意味着在识别应用程序段时我需要 7 个字节的前瞻。