问题标签 [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++ - C和C++之间的指针区别
我注意到以下 C 代码给出“警告:初始化丢弃指针目标类型的限定符”,但它仍然可以编译并按预期运行(输出 'W' 字符)。
在 C++ 中,类似的代码根本无法编译并抱怨“错误:从 'const char*' 到 'char*' 的无效转换”
是什么原因?
是否可以修复 C++ 代码以使其像 C 对应物一样编译(和行为)?
更好的解释:感谢您的所有回答,但你们中的大多数人没有得到我真正的问题,所以我会尝试更详细地解释。
我正在使用用 C 编写的库。标题中的函数原型类似于:
在这个函数的实现中,它碰巧运行了类似的代码
如果我用 C 编写代码并针对这个库进行编译,一切都很好。
现在我想在 C++ 中移植这个库,因为我在 C++ 项目中需要它。通过将函数参数重新定义为变量而不是常量,我成功地移植了库。但由于p
指针实际上不需要更改,我更愿意将其定义为常量,就像在原始 C lib 中一样。放置一个变量而不是一个常量,我最终会在不保留所有原始语义的情况下移植一个库。这很糟糕,因为我不知道 C++ 库是否与原始 C 库运行得一样好。
我希望这足够清楚。
一个(希望)更好的解释:
我正在学习 AVR 教程中的教程 - [CODE][C] 使用 Ragel 灵活/高效地解析字符串,问题与parse_microscript()
函数有关。
因为我想在解析器中嵌入 Arduino 代码(即Serial.println();
),所以我尝试用 C++ 宿主语言而不是教程中建议的 C 来编译这个 Ragel 解析器。
首先,我尝试包含Arduino.h
在生成的 C 代码中,但 Arduino IDE无法编译(我相信是因为混合了 C 和 C++ 代码)。
然后我尝试从同一个 Ragel 脚本生成 C++ 代码,但是在编译多个“从 'const char*' 到 'char*' 的无效转换”时,针对生成的代码触发了错误。
使它在 C++ 中工作的唯一方法是删除所有常量关键字。这很糟糕,因为我正在更改 C 代码的原始语义,但它确实有效。
我试图通过提供上述 C 和 C++ 代码片段来隔离问题,但我可能很难解释这一点。
公认的答案是让 C++ 片段编译的原因,但是当我在 Arduino 代码中尝试这个解决方案时它不起作用。
我将使用以下命令编译的工作 Ragel 脚本ragel -G2 -o microscript.cpp microscript.rl
:
正如您所看到的,我不得不将parse_microscript
函数的第一个参数从 const更改char* p
为char*p
,再更改const char* pe
为char* pe
。
c++ - 在 Ragel 中暂停和恢复解析
我正在使用 Ragel 解析 C++ 中的字符串。我需要能够无限期地暂停解析,然后从中断的地方继续解析。
现在我正试图通过fbreak
在完成动作的末尾放置一个来做到这一点。这似乎工作正常,将控制权交还给父程序。但是,我不确定如何恢复解析。我以为只调用 生成的代码%write exec
就足够了,但似乎并非如此。当它重新解析时,对原始字符串的引用似乎是错误的/丢失了。
不确定我是否在 C++ 中做错了(这不是我的母语),或者我对 Ragel 采取了错误的方法。
这是我的开始和恢复代码:
我第一次调用时start()
,我的状态机最终fbreak
退出,然后我调用resume()
(希望)继续解析。
关于我可能做错了什么的任何指示?
c - 如何让 Ragel EOF 动作起作用
我正在与 Ragel 合作评估 FSA,并且我想嵌入一个用户操作,该操作在我的机器完成输入测试时运行。无论机器是否以接受状态结束,我都需要运行此操作。我从 Ragel 指南中获取了这个修改后的示例,该示例说明了我的目标:
对于这个例子,我的目标是当输入为“foo”或“bar”时 res 为 1,而无论输入如何,finished 为 1。我无法让它工作 - 当 res 为 1 时,finished 似乎是 1,而当 res 为 0 时,finished 似乎是 0。
任何帮助都是极好的。
finite-automata - 在处理 Ragel 中的每个角色后嵌入用户操作
我正在使用 Ragel 来评估 FSA,并且我需要在每次评估输入中的字符之后运行一段代码。Ragel 有允许用户操作嵌入到转换和状态的操作符;然而,经过一些测试,这些用户操作似乎只在机器第一次进入给定状态时运行。因此,如果机器在多个字符中保持一种状态,则不会运行任何用户操作。是否有一种方法可以在每次 ragel 处理输入字符时运行用户操作?
regex - 使用 Ragel 解析用户代理
我有以下来自 apache 的行(更改 apache 日志格式不是一种选择):
我正在尝试用 Ragel 解析它。我正在提取除 user_agent 之外的所有字段。用户指南说,强烈的差异--
确保第一台机器不包含第二台机器。就我而言,我想匹配任何不包含的内容" status="
,这将表示下一个字段。但是,我目前的定义(如下)似乎user_agent
完全跳过了;我仍然得到status
并关注领域。我是否正确利用了强烈的差异?
c - ragel如何从文件中读取源代码?
我不知道 ragel 如何从文件中读取源代码。我看到的所有示例都是从标准输入读取的。
请您给我看一个与 Ragel 接口的 C 语言示例,其中程序不从标准中读取?
lexer - Ragel FSM for parsing SQL-like statements
I'm having a bit of a problem with Ragel, mostly due to still trying to grasp how the whole thing works.
I'm trying to make a simple parser for a language similar to SQL (but less flexible), where you have functions (all uppercase), identifiers (all lowercase) and where you could nest functions within functions.
Here's what I have so far:
It is calling the function_call
action once per character, not picking up the Parameter
s, and I can't think how to make functions work inside functions.
Any tips on what I'm doing wrong here?
state-machine - Ragel、最终状态和 EOF
我不明白 Ragel 认为什么是“最终”状态。IIRC 用户指南说,在机器简化之前是最终状态的状态在之后仍然是最终状态。究竟什么时候是状态决赛,人们如何认识到这一点?
应用:
我正在使用状态机语法来实现字符串查找器——查找长度大于 n 的 ASCII 字符串,并打印它们。这意味着实现最大长度匹配器,如下所示。
尽管点输出没有显示最终状态,但 EOF 转换的行为会有所不同,具体取决于使用的风格{$%@}eof
。我不明白为什么会这样。例如,在下面的has_string
状态中,使用%eof
而不是@eof
导致从终止匹配状态的生成/合成状态之一调用commit_nonstring_eof
和动作。commit_string_eof
这是一个工作状态机。请注意,最右侧的节点退出动作只有一个动作:commit_nonstring_eof
.
这是一个损坏的状态机。请注意,最右侧的节点退出操作同时调用
commit_string_eof
和commit_nonstring_eof
d - 为什么这个 Ragel 文件会产生隐式转换错误?(拉格尔与 D)
我有以下(非常简单的)Ragel 文件scanner.rl
:
我转换scanner.rl
为scanner.d
使用ragel -D scanner.rl
. 当我尝试使用 编译生成的D
文件时dmd scanner.d
,我收到以下错误消息:
scanner.d(97):错误:无法将 const(byte)* 类型的表达式 (&_scanner_actions[cast(ulong)_scanner_from_state_actions[cast(ulong)cs]]) 隐式转换为 byte*scanner.d(110):错误:不能将 const(char)* 类型的表达式 (&_scanner_trans_keys[cast(ulong)_scanner_key_offsets[cast(ulong)cs]]) 隐式转换为 char*scanner.d(166):错误:无法隐式转换表达式 (&_scanner_actions[cast(ulong) const(byte)* 类型的 _scanner_trans_actions[cast(ulong)_trans]]) 到 byte*scanner.rl(22):错误:无法将 immutable(char)* 类型的表达式 (ts) 隐式转换为 ulongscanner.d(186 ): 错误:无法将 const(byte)* 类型的表达式 (&_scanner_actions[cast(ulong)_scanner_to_state_actions[cast(ulong)cs]]) 隐式转换为 byte*
也许我错过了一些重要的东西?
eclipse - Eclipse:它在哪里寻找可执行文件?
我有一个使用 ragel 进行解析的项目。当我尝试编译它时出现此错误。
/bin/sh: ragel: 找不到命令
所以我猜日食正在寻找一条通往拉格尔的道路。目前 ragel 在 /usr/local/bin 中。我无法找出 eclipse 试图在哪里搜索 ragel。