问题标签 [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.
parsing - 我可以将参数传递给我的 fsyacc 解析器吗?
我知道可以将参数传递给词法分析器:
但我无法以类似的方式定义我的解析器开始符号。
我试图这样定义它:(感谢这个问题)
但是我必须像这样定义每个非终端符号,它们都会返回 lambdas。不过,这不是我想要实现的目标,我希望能够scope
在几个非终端中访问参数并在解析期间执行它们的操作。
我注意到IParseStateParserLocalStore
类型中有一个,它只包含(仅通过调试检查)。由于我可以通过每个非终端访问它,我是否可以在其中存储参数,或者这是一个坏主意?LexBuffer
parseState
我曾考虑在解析器的头部使用可变变量,但它们将是静态的(我认为?),这将阻止我同时解析多个输入......
编辑:
目前我将scope
参数存储在特定的令牌中:
我传递scope
给 Lexer,他在创建相关标记时将其嵌入到相关标记中......我真的不喜欢这个解决方案,但我无法想出更好的东西。
macos - 如何在 Mac 上从 F# PowerPack 2.0.0.0 运行 fslex.exe?
我在 Mac 上从 F# PowerPack 2.0.0.0 运行 FsLex 时遇到问题。当我简单地运行程序时,我看到:
我遵循的步骤是:
- 安装 MDK 3.0.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
- 从http://www.microsoft.com/en-us/download/details.aspx?id=11100下载 F# 2.0.0.0 的 2011 年 4 月 CTP并使用该
install-mono.sh
脚本。
错误是什么意思,我该如何解决?
f# - 如何为一个 fslex 规则模式返回多个令牌?
使用fslex我想为一个模式返回多个标记,但我看不到如何实现这一点。即使使用另一个返回多个令牌的规则函数也对我有用。
我正在尝试使用这样的东西:
我在这里要解决的问题是仅当介于和之间时才匹配预定义的标记(请参阅:operations
地图)。否则,匹配项应作为.identifier
.
(
ID
我对 fslex 还很陌生,所以我很高兴看到正确方向的任何指示。
f# - F# 整数文件指令
我一直在使用 fslex 和 fsyacc,并且 F# 源文件(.fs
它们从 lexer ( .fsl
) 和 parser ( .fsp
) 规则生成)在所有地方都引用了原始文件.fsl
(有时是同一个.fs
源文件),并带有这样的语句(数字是行号):
此外,由.fs
生成的文件pars.fsp
做同样的事情,但额外引用了.fsi
与它一起生成的 F# 签名文件 ( )。这些是什么/意味着什么?
f# - 如何使 FsLex 规则尾递归/防止 StackOverflowExceptions
我正在使用 fslex / fsyacc 实现脚本语言,并且在大用户输入(即 >1k 脚本)时遇到问题,特别是当词法分析器分析非常大的字符串时会发生此错误。
我在自定义词法分析器函数中扫描字符串(以允许用户使用反斜杠转义引号等字符)。这是功能:
该函数只是解释各种字符,然后递归调用自身——或者在读取结束引号时返回读取的字符串。当输入太大时,StackOverflowException
要么在_
or(whitespace | ...
规则中抛出 a。
生成的Lexer.fs
包含以下内容:
所以实际的规则变成了_fslex_myText
并myText
用一些 internal 来调用它_fslex_state
。
我认为这是问题所在:myText
不是尾递归的,因为它被转换为 2 个相互调用的函数,这在某些时候会导致StackOverflowException
.
所以我的问题真的是:
1)我的假设正确吗?或者 F# 编译器能否像使用尾递归函数一样优化这两个函数并生成一个 while 循环而不是递归调用?(函数式编程对我来说仍然是新事物)
2)我该怎么做才能使函数尾递归/防止StackOverflowException
?FsLex 文档不是那么广泛,我无法弄清楚官方 F# 编译器的不同之处 - 显然它对大字符串没有问题,但它的字符串规则也递归调用自身,所以我在这里不知所措: /
f# - fslex - 如何在两个令牌集之间切换?
我正在尝试使用fslex
and编写一个小型 DSL 解析器fsyacc
。输入由需要不同词法规则的两种不同语言的交错块组成。我如何编写我的fslex
文件来支持它?
(我想类似的情况是如何fslex
为 c 语言定义一个文件,但支持内联汇编,这需要不同的词法规则?)
我目前拥有的是这样的:
问题是,一旦core
解析器返回一个令牌,输入的下一部分就会被传递给它tokenize
。但是,我想(原样)留core
在该州。我怎么做?
谢谢!
f# - fslex 学习:Lexer 没有进步
我目前正在学习基于解析一个简单计算的词法分析和解析(基于 F# 工具集),我被困在我的词法分析器没有推进以消耗整个字符串:
请注意,例如 final'test lexbuf'
是我必须编写的,以确保我提供的整个字符串都被使用
因为我在实际实现中没有这样做,所以我只是读取例如第一个数字,这就是我得到的全部。
我见过许多结构非常相似的例子。我错过了什么。
f# - fslex - 匹配问题行终止符
请考虑我正在构建的这个词法分析器:
在以点结尾的行上,当前缓冲区将位于点所在的字符处,并表示它无法识别输入。
我真的不知道我做错了什么。
parsing - 区分 F# lex/yacc 解析器中的“减号”运算符和负数
我正在尝试使用 FsLex 和 FsYacc 解析一种简单的脚本语言,但在区分减号运算符和负数时遇到了问题。
如果我评估术语“1 - 2”,解析器将返回所需的 AST: Minus(NumberLiteral(1.0),NumberLiteral(2.0))
。但是如果我评估术语“1-2”,词法分析器将产生数字 1,然后是数字 -2,这不是有效的输入。
我制作了一个最小的程序来重现我的问题。Ast 定义如下:
词法分析器代码如下所示:
解析器如下所示:
我最初的想法是不在-
词法分析器中处理数字的一部分,并让解析器确定MINUS
标记是否应该产生减号运算符或负数。不幸的是,这也会导致输入“- 2”被评估为负数,因为会消耗空格。
但我认为这一定是一个普遍的问题,并且必须存在一个共同的解决方案。那么我该如何最好地处理这个问题呢?
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 上的两个不同项目。
问题:我缺少哪些步骤?接下来我应该检查什么?