问题标签 [fslex]

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.

0 投票
1 回答
284 浏览

parsing - 我可以将参数传递给我的 fsyacc 解析器吗?

我知道可以将参数传递给词法分析器:

但我无法以类似的方式定义我的解析器开始符号。

我试图这样定义它:(感谢这个问题)

但是我必须像这样定义每个非终端符号,它们都会返回 lambdas。不过,这不是我想要实现的目标,我希望能够scope在几个非终端中访问参数并在解析期间执行它们的操作。

我注意到IParseStateParserLocalStore类型中有一个,它只包含(仅通过调试检查)。由于我可以通过每个非终端访问它,我是否可以在其中存储参数,或者这是一个坏主意?LexBufferparseState

我曾考虑在解析器的头部使用可变变量,但它们将是静态的(我认为?),这将阻止我同时解析多个输入......

编辑:

目前我将scope参数存储在特定的令牌中:

我传递scope给 Lexer,他在创建相关标记时将其嵌入到相关标记中......我真的不喜欢这个解决方案,但我无法想出更好的东西。

0 投票
1 回答
361 浏览

macos - 如何在 Mac 上从 F# PowerPack 2.0.0.0 运行 fslex.exe?

我在 Mac 上从 F# PowerPack 2.0.0.0 运行 FsLex 时遇到问题。当我简单地运行程序时,我看到:

我遵循的步骤是:

  1. 安装 MDK 3.0.2。
  2. sudo gacutil -i在每个 DLL 上下载 2010 年 5 月 20 日发布的 F# PowerPack 2.0.0.0 。sudo cp -r FSharpPowerPack-2.0.0.0 /Library/Frameworks/Mono.framework/Versions/3.0.2/lib/mono
  3. 从http://www.microsoft.com/en-us/download/details.aspx?id=11100下载 F# 2.0.0.0 的 2011 年 4 月 CTP并使用该install-mono.sh脚本。

错误是什么意思,我该如何解决?

0 投票
3 回答
610 浏览

f# - 如何为一个 fslex 规则模式返回多个令牌?

使用fslex我想为一个模式返回多个标记,但我看不到如何实现这一点。即使使用另一个返回多个令牌的规则函数也对我有用。

我正在尝试使用这样的东西:

我在这里要解决的问题是仅当介于和之间时才匹配预定义的标记(请参阅:operations地图)。否则,匹配项应作为.identifier.(ID

我对 fslex 还很陌生,所以我很高兴看到正确方向的任何指示。

0 投票
1 回答
130 浏览

f# - F# 整数文件指令

我一直在使用 fslex 和 fsyacc,并且 F# 源文件(.fs它们从 lexer ( .fsl) 和 parser ( .fsp) 规则生成)在所有地方都引用了原始文件.fsl(有时是同一个.fs源文件),并带有这样的语句(数字是行号):

此外,由.fs生成的文件pars.fsp做同样的事情,但额外引用了.fsi与它一起生成的 F# 签名文件 ( )。这些是什么/意味着什么?

0 投票
1 回答
133 浏览

f# - 如何使 FsLex 规则尾递归/防止 StackOverflowExceptions

我正在使用 fslex / fsyacc 实现脚本语言,并且在大用户输入(即 >1k 脚本)时遇到问题,特别是当词法分析器分析非常大的字符串时会发生此错误。

我在自定义词法分析器函数中扫描字符串(以允许用户使用反斜杠转义引号等字符)。这是功能:

该函数只是解释各种字符,然后递归调用自身——或者在读取结束引号时返回读取的字符串。当输入太大时,StackOverflowException要么在_or(whitespace | ...规则中抛出 a。

生成的Lexer.fs包含以下内容:

所以实际的规则变成了_fslex_myTextmyText用一些 internal 来调用它_fslex_state

我认为这是问题所在:myText不是尾递归的,因为它被转换为 2 个相互调用的函数,这在某些时候会导致StackOverflowException.

所以我的问题真的是:

1)我的假设正确吗?或者 F# 编译器能否像使用尾递归函数一样优化这两个函数并生成一个 while 循环而不是递归调用?(函数式编程对我来说仍然是新事物)

2)我该怎么做才能使函数尾递归/防止StackOverflowException?FsLex 文档不是那么广泛,我无法弄清楚官方 F# 编译器的不同之处 - 显然它对大字符串没有问题,但它的字符串规则也递归调用自身,所以我在这里不知所措: /

0 投票
1 回答
98 浏览

f# - fslex - 如何在两个令牌集之间切换?

我正在尝试使用fslexand编写一个小型 DSL 解析器fsyacc。输入由需要不同词法规则的两种不同语言的交错块组成。我如何编写我的fslex文件来支持它?

(我想类似的情况是如何fslex为 c 语言定义一个文件,但支持内联汇编,这需要不同的词法规则?)

我目前拥有的是这样的:

问题是,一旦core解析器返回一个令牌,输入的下一部分就会被传递给它tokenize。但是,我想(原样)core在该州。我怎么做?

谢谢!

0 投票
2 回答
131 浏览

f# - fslex 学习:Lexer 没有进步

我目前正在学习基于解析一个简单计算的词法分析和解析(基于 F# 工具集),我被困在我的词法分析器没有推进以消耗整个字符串:

请注意,例如 final'test lexbuf'是我必须编写的,以确保我提供的整个字符串都被使用

因为我在实际实现中没有这样做,所以我只是读取例如第一个数字,这就是我得到的全部

我见过许多结构非常相似的例子。我错过了什么。

0 投票
0 回答
88 浏览

f# - fslex - 匹配问题行终止符

请考虑我正在构建的这个词法分析器:

在以点结尾的行上,当前缓冲区将位于点所在的字符处,并表示它无法识别输入

我真的不知道我做错了什么。

0 投票
1 回答
2018 浏览

parsing - 区分 F# lex/yacc 解析器中的“减号”运算符和负数

我正在尝试使用 FsLex 和 FsYacc 解析一种简单的脚本语言,但在区分减号运算符和负数时遇到了问题。

如果我评估术语“1 - 2”,解析器将返回所需的 AST: Minus(NumberLiteral(1.0),NumberLiteral(2.0))。但是如果我评估术语“1-2”,词法分析器将产生数字 1,然后是数字 -2,这不是有效的输入。

我制作了一个最小的程序来重现我的问题。Ast 定义如下:

词法分析器代码如下所示:

解析器如下所示:

我最初的想法是不在-词法分析器中处理数字的一部分,并让解析器确定MINUS标记是否应该产生减号运算符或负数。不幸的是,这也会导致输入“- 2”被评估为负数,因为会消耗空格。

但我认为这一定是一个普遍的问题,并且必须存在一个共同的解决方案。那么我该如何最好地处理这个问题呢?

0 投票
1 回答
155 浏览

f# - FsLexYacc:测试/MiniProject“.fsproj 中的导入不正确”

github 上FsLexYacc项目有一个测试目录。我尝试设置最简单的一个(“LexAndYaccMiniProject”)。

我按照以下步骤操作:

1/ 创建一个名为“LexAndYaccMiniProject”的 F# 控制台应用程序

2/安装包(“ PM > Install-Package FsLexYacc”来自VS 2013社区,它运行成功但只在项目目录下的包目录中创建文件)

3/ 关闭解决方案

4/ 将所有文件(Lexer.fsl、Parser.fsy、Program.fs、LexAndYaccMiniProject.fsproj、App.config)从 github 复制到本地项目目录

5/打开解决方案 --> 错误消息说没有这样的“bin\Debug\FsLexYacc.targets”文件。

从 FsLexYacc主页安装说明,我得到一个 .fsproj 的链接,其中包含:

它与另一个项目(TestProjectUsingNugetPackage)有关,该链接不同于上面“示例”部分中的链接,指的是我已经复制的项目(“ LexAndYaccMiniProject ”)。

显然,FsLexYacc 主页安装说明部分通过链接指向最近托管在 github 上的两个不同项目。

问题:我缺少哪些步骤?接下来我应该检查什么?