首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对fslex和fsyacc的编程访问

对fslex和fsyacc的编程访问
EN

Stack Overflow用户
提问于 2013-10-05 11:01:11
回答 2查看 372关注 0票数 5

fslex和fsyacc工具目前需要两阶段编译,生成的文件随后由fsc编译。在我看来,如果源文件是嵌入式资源,以编程方式提供给fslex和fsyacc,并使用CodeDom动态编译生成的代码,那么这些工具将更容易使用。

这是可行的吗?如果可行,实现这一点需要什么?

EN

回答 2

Stack Overflow用户

发布于 2013-10-05 19:47:24

乔恩,这是一个很好的问题;事实上,我对fsharp-tools (F#的新的词法分析器和解析器生成器实现)的设计目标之一就是它们是可嵌入的,特别是为了支持这样的场景。

到目前为止,我还没有实现(还没有)让你在fsharplex中轻松做到这一点的功能,但不要让它阻止你;我已经以或多或少的纯函数式风格编写了fsharplex (和其他工具),所以应该不会有任何全局状态或类似的问题。编译编译器代码应该是相对简单的,这样您就可以使用一些组合子构建一个regex AST,运行编译器以获得已编译的DFA,然后将状态机的IL发送到一个动态程序集中(然后可以“烘焙”并执行)。

fsharpyacc目前使用的是一种方法,我已经将大部分编译逻辑放入一个纯函数库Graham中;这里的想法是语法分析/操作和解析器DFA编译算法应该是通用的、可重用的和易于测试的,因此任何其他想要使用F#构建语言工具的人都将有一个通用的框架来构建它们。同样,对Graham的贡献/改进可以很容易地回流到fsharpyacc。最后,我将修改fsharplex以使用同样的方法,这将允许您通过引用NuGet包(只需编写代码从NuGet生成IL )将正则表达式编译器嵌入到您自己的代码中。

fsharplex和fsharpyacc使用MEF来允许插入不同的后端;目前,出于兼容性原因,它们只针对fslexfsyacc,但我希望实现基于代码的后端(而不是当前基于表的后端),以便在未来获得更好的性能。

更新--我刚刚重新阅读了您的问题,并注意到您希望嵌入*.fsl*.fsy文件本身,并在运行时调用各自的编译器。您可以通过编译工具并引用您自己项目中的程序集来完成此操作。IIRC,我公开了两个编译器中的入口点,以便可以从外部代码调用它们;主要入口点(例如,当您从控制台调用工具时执行的入口点)只是解析命令行参数,然后将它们传递到这个“外部”入口点。

但是,直接嵌入*.fsl*.fsy文件有一个问题;如果您嵌入它们,然后在运行时通过fsharplex和fsharpyacc运行它们,那么您的用户定义操作(例如,当词法分析器或解析器规则匹配时执行的代码)仍将被指定为F#源代码--您需要决定如何将它们编译为可执行代码。

票数 4
EN

Stack Overflow用户

发布于 2013-10-05 11:16:30

提供一个类似解析器组合器的接口应该是可行的,该接口具有使用表达式树(F#的LISP "eval“)或类似东西的后端,以便与该语言完全集成。或者是TypeProvider。有很多选择。如果表生成是一项昂贵的计算,则可以通过提供Cache (例如磁盘缓存)对其进行缓存。

我认为除了缺乏时间、敬业精神和专业知识之外,没有什么会阻碍我们拥有具有(非一元)解析器combinator类接口的工具,但高效的编译实现。

有时,我会回到我喜欢的这个项目上,使用代数方法来优化源代码中指定的正则表达式(和词法分析器),使用组合子,然后编译成状态机。它仍然缺乏效率的几个关键部分,但它存在:

https://github.com/toyvo/ocaml-regex-algebraic

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19193511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档