- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
fslex 和 fsyacc 工具目前需要 2 阶段编译,生成文件,然后由 fsc 编译。在我看来,如果源文件是嵌入式资源,以编程方式提供给 fslex 和 fsyacc,并且生成的代码使用 CodeDom 即时编译,那么这些工具会更容易使用。
这是否可行,如果可行,实现此操作需要什么?
最佳答案
乔恩,这是一个很好的问题;事实上,我的设计目标之一是 fsharp-tools (F# 的新词法分析器和解析器生成器实现)是为了它们是可嵌入的,专门用于启用这样的场景。
到目前为止,我还没有实现(还)可以让您在 fsharplex 中轻松完成此操作的功能,但不要让它阻止您;我已经以或多或少的纯函数风格编写了 fsharplex(以及 fsharp-tools 中的其他工具),因此全局状态或类似的东西不应该有任何问题。破解编译器代码应该相对简单,因此您可以使用一些组合器构建正则表达式 AST,运行编译器以获取已编译的 DFA,然后将状态机的 IL 发送到动态程序集(然后您可以“烘焙”)并执行)。
fsharpyacc 目前使用的方法是我将大部分编译逻辑放入一个纯函数库 Graham 中;那里的想法是语法分析/操作和解析器 DFA 编译算法应该是通用的、可重用的且易于测试,因此任何想要使用 F# 构建语言工具的人都将拥有一个通用框架来构建它们。同样,对 Graham 的贡献/改进很容易流回到 fsharpyacc。最后,我将修改 fsharplex 以使用相同的方法,这将允许您通过引用 NuGet 包将正则表达式编译器嵌入到您自己的代码中(您只需要编写代码以从 DFA 生成 IL)。
fsharplex 和 fsharpyacc 使用 MEF 来允许插入各种后端;目前,他们只针对 fslex
和 fsyacc
出于兼容性原因,但我想实现基于代码的后端(而不是当前基于表的后端)以在 future 获得更好的性能。
更新 - 我刚刚重新阅读了您的问题,并注意到您想嵌入 *.fsl
和 *.fsy
文件本身并在运行时调用相应的编译器。您可以通过编译工具并从您自己的项目中引用程序集来完成此操作。 IIRC,我在两个编译器中公开了一个入口点,以便可以从外部代码调用它们;主要入口点(例如,从控制台调用工具时执行的内容)只是解析命令行参数,然后将它们传递到这个“外部”入口点。
直接嵌入 *.fsl
存在一个问题和 *.fsy
文件虽然;如果您嵌入它们,然后在运行时通过 fsharplex 和 fsharpyacc 运行它们,您的用户定义操作(例如,匹配词法分析器或解析器规则时执行的代码)仍将被指定为 F# 源代码——您会需要决定如何将它们编译成可执行代码。
关于f# - 以编程方式访问 fslex 和 fsyacc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193511/
如果我使用 FSYacc 生成解析器,它会是线程安全的吗? 我问的唯一原因是因为功能 Parsing.rhs_start_pos 和 Parsing.symbol_end_pos 似乎没有向它们传递任
我开始玩 Fslex/Fsyacc。尝试使用此输入生成解析器时 解析器.fsy: %{ open Ast %} // The start token becomes a parser function
我正在使用 F# Power Pack 中的 fsyacc/fslex 来解析一些源代码。 为了检测错误,我使用以下代码: use inputChannel = new StreamReader(Fi
我知道可以将参数传递给词法分析器: rule tokenize scope = parse | whitespace { tokenize scope lexbuf
在阅读了一个 2 年历史的网页后,与他们的 OCamel 同行相比,它确实撕裂了 fslex/fsyacc、错误、缓慢、愚蠢等,我想知道什么是词法解析需求的最佳选择? 我以前用 C# 绑定(bind)
fslex 和 fsyacc 工具目前需要 2 阶段编译,生成文件,然后由 fsc 编译。在我看来,如果源文件是嵌入式资源,以编程方式提供给 fslex 和 fsyacc,并且生成的代码使用 Code
我正在尝试培养一些词法分析/解析语法的技能。我回顾了我为 SQL 编写的一个简单解析器,我对它并不完全满意——似乎应该有一种更简单的方法来编写解析器。 SQL 让我很困惑,因为它有很多可选标记和重复。
这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
我正在使用 FsLex 和 FsYacc 在 F# 应用程序中进行字符串解析。在抽象语法树 (AST) 创建期间,解析器必须决定如何创建 AST(创建不同的树、抛出异常等)。解析器行为必须取决于几个参
我需要解析如下简单的 DSL 语言: import "library.txt" def main(int param1, bool param2) { var a = f4(param1);
我正在使用 F# 开发玩具编译器,即 FsLex 和 FsYacc 的组合。为了熟悉它们,我阅读了 Expert F# (v2) 一书(一本好书)的 Lexer/Parser 章节。现在,我已经完成了
我正在学习 F#,因为我想编写一个词法分析器和解析器。我对这种处理有一点经验,但确实需要像 F# 一样正确地学习它。 在学习 F# 的词法/解析功能时,学习 lex 和 yacc 就足够了吗? 或者是
我遇到了 FSlex/FSyacc 在我的机器上崩溃的问题。 在上下文中,这是在 Parallels 虚拟机内运行的 Windows 8 Consumer Preview(32 位)上运行的 Visu
我在 Visual Studio 中使用 fsyacc(使用 Parsed Language Starter 模板),但构建输出没有显示发生错误的行/列(仅:fsyacc 退出,代码为 1)。我必须从
我是一名优秀的程序员,十分优秀!