问题标签 [fsyacc]
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.
f# - 用 OcamlYacc / FsYacc 表示可选语法和重复
我正在尝试在词法分析/解析语法方面建立一些技能。我正在回顾我为 SQL 编写的一个简单的解析器,但我对它并不完全满意——似乎应该有一种更简单的方法来编写解析器。
SQL 让我大吃一惊,因为它有很多可选的标记和重复。例如:
相当于:
ON
and子句是可选的WHERE
,可以出现多次。我在解析器中处理这些如下:
换句话说,我通过将可选语法分解为单独的规则来处理可选语法,并使用递归处理重复。这行得通,但是它将解析分解为一堆小子例程,并且很难看出语法实际代表什么。
如果我可以在括号内指定可选语法并使用 * 或 + 重复,我认为编写起来会容易得多。这会将我的 whereClause 和 joinList 规则减少到以下内容:
我认为这种形式更容易阅读,并且更直观地表达了它试图捕捉的语法。不幸的是,我在 Ocaml 或 F# 文档中找不到任何支持此表示法或类似内容的内容。
在 OcamlYacc 或 FsYacc 中是否有一种简单的方法来表示具有可选或重复标记的语法?
f# - FSYacc 线程生成的解析器是否安全?
如果我使用 FSYacc 生成解析器,它会是线程安全的吗?
我问的唯一原因是因为功能
Parsing.rhs_start_pos
和Parsing.symbol_end_pos
似乎没有任何状态传递给它们,这将导致我假设他们正在从共享位置获取当前的非终端/符号,这是正确的吗?
反映代码后,我看到他们正在从静态属性中获取位置
它是否正确?如果是这样,我该怎么办?
编辑:我还看到一个名为的静态方法set_parse_state
但这仍然不能解决我的问题......
f# - fslex 词法分析 javascript 正则表达式
我正在尝试使用 lex javascript 正则表达式文字。这些以“/”开头并以“/”结尾(有时还有一些其他修饰符)。问题是确定它是否是正则表达式而不是除法运算符的唯一方法是读取“/”字符之前的标记。
可以在这里阅读更多内容。
事实上,我找不到任何关于如何获取前一个令牌的文档。希望这是可能的,有人可以告诉我如何。
谢谢。
f# - lex/yacc 和 fslex/fsyacc 有什么区别?
我正在学习 F#,因为我想编写一个词法分析器和解析器。我对这种处理有一点经验,但真的需要像 F# 一样正确地学习它。
在学习 F# 的词法/解析功能时,学习 lex 和 yacc 是否足够?
或者是否有一些差异意味着 lex/yacc 的代码不适用于 fslex 和 fsyacc?
f# - F# 2.0 与 Powerpack 2.0,fslex 错误 1
在命名空间 RSLispV3.RunTime: http ://pastebin.com/XNb9qi11
LispParser.fsy: http ://pastebin.com/pymF1Vvm
LispLexer.fsl: http ://pastebin.com/pfXdDuxs
我进入 MSBuild 的 PowerPacks 目标,从 .fsprog 调用它们。
使用 VS2008 构建时出现错误:“fslex.exe”以代码 1 退出。
帮助?
f# - FsLex 和 FsYacc 的疯狂错误
我正在尝试编译这个项目:
但是我得到了一堆无意义的错误。他们得到了我熟悉的文本,但在这个位置上没有类似的东西(比如空行中的意外')')。
请帮帮我!
.net - 是否可以定义相互依赖并在单独的文件中定义的类型?
我正在尝试实现一个具有扩展解析功能的库。我决定使用 fsyacc,因为我从大学就知道它。不幸的是我遇到了以下问题。
我为我的语法头( Head )定义了一个类,并将其实现放在一个文件中。然后我将解析器定义为:
Fsyacc 生成分离模块(Parser)。为了成功,它必须按以下顺序编译:Head.fs
Parser.fs
为了使这个库类似于您在 .NET 中可以找到的库,我想向Head添加一个静态Parse方法。不幸的是,我需要使用Parser模块中的方法。
我知道这种类型的依赖可以用'和'运算符来解决,但它只适用于在一个文件中定义的类型。
有没有其他方法可以创建相互依赖的类型,即使它们位于单独的文件中?我一直在寻找像 C/C++ 中的声明/实现分离机制,但我找不到任何东西。
compiler-construction - Fsyacc 的示例语法错误?
所以我正在尝试用 F# 编写一个编译器,并且一直在研究 F# powerpack 附带的 Fslex 和 Fsyacc 工具。有一个示例项目负责处理我一直试图理解的外部构建工具。可以在这里下载。该示例为我编译并运行,但我认为语法中有一个细微的错误。我说微妙,因为语法看起来类似于我在 Dragon 书中看到的用于解析表达式的语法,而且我没有发现它的经验。
输入“4*5+3”正确评估为 23。
但是,输入 4*5-3 会产生解析错误。这是 Fsyacc 生成的代码中的错误。
感谢您帮助我更好地了解问题所在,以便我能更好地了解情况并对 Fsyacc 更有信心。我在下面发布了 *.fsy 文件。
这是AST数据类型的定义
编辑
我已经发布了词法分析器定义和驱动解析器的代码,以帮助理解错误。
最后,驱动解析器的代码。
编辑:词法分析器中的可选减号是问题所在。删除它后,样本按预期工作。
parsing - 如何在 F# 解析过程中处理错误
我正在为我的 F# Lexer 和 Parser 使用 fslex/fsyacc 实用程序。如果输入文本的语法不正确,则有必要知道它发生的位置。
可以在 Lexer 中确定不正确的词位(标记)并在使用不正确的符号或单词时抛出异常:
这个问题更多地与 Parser (fsyacc) 相关 - 如果输入文本具有正确的标记并且被 Lexer 成功标记化,但在解析期间发生错误(例如,不正确的标记顺序或规则中缺少某些标记)
我知道如果捕获异常,这给出解析失败的位置(行和列):
但是是否有可能(如果是 - 怎么做?)也可以确定解析失败的 AST 类。
例如,是否可以在我的 parser.fsy 文件中编写类似于以下内容的内容:
f# - F# fslex fsyacc 成熟的生产代码?
在阅读了一个 2 年历史的网页后,与他们的 OCamel 同行相比,它确实撕裂了 fslex/fsyacc、错误、缓慢、愚蠢等,我想知道什么是词法解析需求的最佳选择?
我以前用 C# 绑定使用过 ANTLR,但目前正在学习 F#,当我看到它带有解析器生成器时很兴奋。由于 F# 现已正式发布,微软似乎真正致力于支持和开发。你会说 fslex 和 fsyacc 对于生产代码来说值得吗?