- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我继承了一个使用 Ragel 进行字符串解析的 C++ 项目。
这是我第一次看到这样做,我想了解为什么有人会使用 Ragel 而不是 C++ 来解析字符串?
最佳答案
parser generators (不恰本地称为“编译器-编译器”)非常易于使用并生成可靠且高效的 C++ 或 C 代码(特别是因为 parsing 理论很好理解)。
一般来说,使用源代码生成器可能是明智之举。有时,特别是在大型项目中,编写自己的一个是明智的(阅读 metaprogramming ,特别是 SICP 甚至 J.Pitrat's blog )。好build automation GNU make 等工具或 ninja可以轻松配置为运行 C 或 C++ 代码生成器并在构建时使用它们。
阅读Ragel介绍。另请查看 flex , bison , ANTLR , rpcgen , Qt moc , swig , gperf作为 C 或 C++ 生成器的常见示例。
在某些程序中,您甚至可以使用一些 JIT compilation库(例如 libgccjit 或 LLVM )在运行时动态生成代码并使用它。在 POSIX 系统上,您还可以在运行时生成临时 C 或 C++ 文件,将其编译为 plugin ,并使用 dlopen 加载该临时插件& dlsym .拥有关于编译器和解释器的良好文化(例如通过 Dragon Book )是值得的。
在您的应用程序中嵌入一些解释器(如 lua 或 guile )也是一种有趣的方法。但这是一个强有力的架构决策。
在许多情况下,生成源代码比手写更容易。当然,这并不总是可能的。
附言。在阅读您的问题之前,我从未听说过 Ragel!
关于c++ - 在 C++ 代码库中使用 Ragel 解析字符串的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486837/
是否有更好的方法来要求 Ragel 消耗所有输入?这是我现在使用的: =begin %%{ machine my_lexer; # ... # extract tokens and sto
我正在考虑使用 Ragel 在嵌入式系统中为 NMEA GPS 数据生成词法分析器。我会有一个任意大小的缓冲区,我可以在其中读取来自 UART 的数据块,并且对于每次读取,我都会将该数据传递给词法分析
我正在为相当简单的二进制协议(protocol)编写 Ragel 机器,我在这里展示的是更简化的版本,没有任何错误恢复,只是为了演示我试图解决的问题。 因此,这里要解析的消息如下所示: 机器看起
假设我们想要在用户输入 JTextField 时验证用户输入。为了验证用户输入,我想知道我是否可以使用 Ragel。 假设输入应该遵循这个例子的正则表达式: [a-z]{2,5}ABC[0-9]+ 我
我正在尝试实现一种语言,我正在使用 Ragel 作为词法分析器(并将 bison 作为解析器)。我希望能够在我的语言中支持字符串插值,但我不确定如何做到这一点。 我的词法分析器对语言的主要部分使用如下
我一直在研究简单模板语言的解析器。我用的是拉格尔。 要求并不高。我试图找到可以嵌入输入字符串中任何位置的 [[tags]]。 我正在尝试解析一种简单的模板语言,这种语言可以在 HTML 中嵌入诸如 {
我是 Ragel 的新手,一直在尝试解析 Regex 表达式的特定模式。如果找到匹配项,我希望执行操作 done ,如果没有匹配项,即使缺少任何单个字符,我也希望执行 parse_error 。 这是
我有两个状态;一个是另一个更一般的状态的特定实例。我相信避免同时进入两种状态的正确方法是使用 k>1 实现前瞻,但我找不到任何示例说明如何执行此操作。 Ragle 用户指南说: In both the
%%{ machine microscript; action ClearNumber { currentNumber = 0; } action RecordDigit {
我正在创建一个相当简单的解析器,它没有递归结构或任何太具有挑战性的东西。 我想做的是,当我遇到一个“命令”时,我想调用一个单独的解析函数(以宿主语言),例如 parseCommandType1,然后根
这是语法的起点: %%{ machine xo; char = "x" | "o"; group = "(" char* ")"; main := group; }%% 例如,它处理
我正在尝试为我出于个人原因而设计的 C/C++/C#/Java/D 之类的编程语言编写扫描仪。对于这个任务,我使用 Ragel 来生成我的扫描仪。我无法准确理解许多操作符何时触发 Action ,可能
我正在尝试使用 Ragel 来实现一个简单的是/否 fsm。不幸的是,语言规范由大约一千个正则表达式的并集组成,其中 * 运算符在大多数表达式中出现一次或多次。因此,可能状态的数量激增,似乎不可能使用
更新 2 原始问题:如果我不需要回溯,我可以避免使用 Ragel 的 |**| 吗? 更新的答案:是的,如果您不需要回溯,您可以使用 ()* 编写一个简单的分词器。 更新 1 我意识到询问 XML 标
我是编译器世界的新手,最近听说了一种叫做解析器生成器的东西。根据我(认为)我所理解的,解析器生成器接收一个语法文件并输出一个源代码文件,该文件可以使用给定的语法解析文件。 几个问题: 我理解正确吗?
过去 2 天我一直在努力学习 Ragel,但一直面临一些与 Ragel 语法相关的问题。我的目标是编写一个解析器,以 C++ 作为宿主语言来识别 Regex 命令。现在我正在尝试使用解析器识别以下命令
我继承了一个使用 Ragel 进行字符串解析的 C++ 项目。 这是我第一次看到这样做,我想了解为什么有人会使用 Ragel 而不是 C++ 来解析字符串? 最佳答案 parser generator
我正在与 Ragel 合作评估 FSA,我想嵌入一个用户操作,该操作在我的机器完成输入测试时运行。无论机器是否以接受状态结束,我都需要运行此操作。我从 Ragel 指南中获取了这个经过修改的示例,它说
我在 Go 中使用 Ragel 6.10。我确定这可能是我的代码有问题,但是当我尝试将堆栈与扫描仪 block 一起使用时,我遇到了一些奇怪的错误。我正在尝试设置括号匹配,我的代码大致如下所示; Ob
函数模板如下: func GetIntersection(firstRegex string, secondRegex string) string { ... } 我正在尝试使用 Ragel
我是一名优秀的程序员,十分优秀!