问题标签 [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.
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.rl和https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizer看到读取/缓冲代码.rl
regex - 无法将 URL 解析器正则表达式转换为 Ragel
我在 RFC 2396 和 RFC 3986 中找到了一个 URL 解析器正则表达式。
我将其转换为 Ragel:
当我输入绝对 URI 时它就起作用了。
当我输入权限和路径时成功:
但是当我只输入路径时失败:
怎么了?
c - 如何让 Ragel 解析由 (space* ":" space*) 分隔的两个名称?
我想解析以下内容:
其中名称以 alnum 开头和结尾,并且可以包含 alnum 和空格的任意组合。它们也可以是空白的。我的规则是:
名称可以用冒号分隔,也可以在名称和冒号之间使用空格。我的规则是:
这不起作用,因为显然space*
inidentifier
和space*
insep
混淆了解析器。我最终fName
会在名称的每个空格中执行操作。
如果我将 sep 更改为:
那么一切都很好。如何修改这些规则,以便解析器执行我想要的操作?
这个问题的源代码在这里:https ://gist.github.com/1661150
ragel - 匹配文件的开头或换行符 (Ragel)
我使用 ragel 和 C 作为宿主语言。
我可以简单地用'\n'识别换行符,但我需要识别文件的开头作为替代。
在正则表达式的其他实现中,这可以由\A
or给出$
,但$
保留用于其他目的,'\A'
映射到其他东西(警报?)并\A
给出解析器错误。
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 的较新版本。这有助于澄清解析规则。但是,它没有解决我的其他观点:
我没有看到任何令人信服的理由让规范在评论中包含评论。这似乎是不必要的——也许是过度设计的,也许是被忽视的。这既烦人又重要,因为递归规则使格式成为非常规语言。这是规范编写者通常应该注意的事情,对吧?
我还没有(还没有?)看到在评论中使用评论的例子。如果是这样的话,世界已经含蓄地说“嵌套评论无关紧要”。
ruby - 平衡括号的简单 Ragel 示例?
这是语法的起点:
(xxxx(oo)()xx)
例如,它处理。如何扩展它以允许嵌套组;例如(xxxx(o(x)o)()xx
?
我知道递归通常不受一台 Ragel 机器的支持。所以这行不通:
来自Ragel State Machine Compiler User Guide (PDF):(为强调而添加了粗体文本):
“一般来说,Ragel 无法处理递归结构,因为语法被解释为常规语言。但是,根据需要解析的内容,有时使用手动编码技术实现递归部分是可行的。这通常适用于递归结构的情况简单且易于识别,例如在括号的平衡中。”
“解析递归结构的一种方法是使用递增和递减计数器的操作,或者以其他方式识别递归结构的入口和出口,然后使用 fcall 和 fret 跳转到适当的机器定义。或者,可以使用语义条件来测试计数器变量。
“一种更传统的方法是在输入递归结构时调用单独的解析函数(以宿主语言表示),然后在识别到结尾时返回。”
从关于嵌套括号的邮件列表讨论中,提到了相同的三种方法:
使用 prepush 和 postpop 指定一个可增长的堆栈,然后使用 fcall 和 fret。
计数,然后在动作或条件中验证。
输入递归结构时调用新的解析函数(以宿主语言)。
你能给我举一个例子吗——最好使用我上面的例子——在 Ruby 中?谢谢!
ragel - 检查 Ragel 是否匹配整个输入
是否有更好的方法要求 Ragel 消耗所有输入?这是我现在使用的:
以上大部分都是样板,除了data.length == p
测试。它有效——除了它不验证词法分析器是否以最终状态结束。因此,即使没有成功解析整个输入,我也有一些测试用例可以返回令牌。
有没有更好的办法?
(直接测试最终状态可能会更好。我正在研究如何做到这一点。想法?)
java - 编译 Ragel 6.7 生成的 java 代码时出错
我正在尝试使用 Ragel 编写一个简单的 Lexer,并将其输出为 Java 有效代码,但生成的代码无法编译。
这是我正在使用的 Lexer.rl:
生成的文件和错误输出在:https ://gist.github.com/3495276 (因为太大,这里贴不上 =S )
那么,我做错了什么?
ruby - 如何用 Ragel 解决这种歧义?
我正在尝试解析以下格式:(identifier/)?identifier(/keyword)?
,带有第一个标识符以及可选的关键字。关键字不能用作标识符。例如,如果up
是关键字,则:
simple
匹配第二个标识符,first/second
匹配first
作为第一个标识符,second
作为第二个标识符,second/up
second
作为第二个标识符和up
关键字匹配。
将Ragel与 Ruby 结合使用,我定义了以下 FSM:
这给出了以下输出:
这是不正确的,因为第一部分应该是First: first
Second: second
,但由于:>
我给出的优先级而预期。
我尝试了不同的优先级组合,但未能获得预期的结果。有没有办法用 Ragel 解决这个问题(即,这可以在没有前瞻的情况下解决)?
c - 如何在 Ragel 中实现前瞻
我有两种状态;一个是另一个更一般的状态的特定实例。我相信避免同时进入两种状态的正确方法是使用 k>1 实现前瞻,但我找不到任何如何做到这一点的例子。
Ragle 用户指南说:
在使用 fhold 和 fexec 时,用户必须小心将生成的机器与另一台机器组合在一起,以便调整当前位置的转换不会与来自另一台机器的转换组合。
我不完全确定这意味着什么,除了“不要尝试阅读当前表达式的末尾”。
我的机器是这样的:
我想标记 JPEG 标头,跳过未知段并处理 JFIF 等众所周知的段。JPEG 应用程序段 app0 以0xFFE0
. 如果 app0 包含 JFIF 数据,则 app0 标记后跟一个 2 字节长度和字符串“ JFIF\0
”。这意味着在识别应用程序段时我需要 7 个字节的前瞻。