gpt4 book ai didi

parsing - 如何在使用 F# FsYacc 解析期间添加和使用自定义上下文参数?

转载 作者:行者123 更新时间:2023-12-02 02:14:11 25 4
gpt4 key购买 nike

我正在使用 FsLexFsYacc 在 F# 应用程序中进行字符串解析。在抽象语法树 (AST) 创建期间,解析器必须决定如何创建 AST(创建不同的树、抛出异常等)。解析器行为必须取决于几个参数。

Here我发现允许声明如下内容:

%type < (context -> context) > toplevel

但是我找不到如何使用这个构造,并且在项目编译期间有“fsyacc.exe”以代码 1 退出。” 错误

问题是:在使用 FsYacc 解析期间是否可能以及如何使用上下文参数?

示例 我尝试过的内容:

%start startAst

%type < (bool -> MyAst) > startAst

%%

startAst:
| MyAst EOF {
(fun (x : bool) ->
if x then
MyAst.Type1 $1
else
MyAst.Type2)
}
...

我期望这样的用法:

let lexbuf = Lexing.LexBuffer<char>.FromString text
lexbuf |> Lexer.tokenize |> Parser.startAst (ctx: bool)

提前致谢

更新 fsyacc.exe 执行期间生成以下异常和调用堆栈:

Unhandled Exception: System.Exception: more than one input given
at FSharp.PowerPack.FsYacc.Driver.clo@67-5.Invoke(String x)
at <StartupCode$fsyacc>.$Arg.findMatchingArg$cont@104-1(FSharpRef`1 cursor, FSharpFunc`2 other, String usageText, FSharpList`1 argSpecs, String arg, Unit unitVar)
at <StartupCode$fsyacc>.$Arg.findMatchingArg@64(FSharpRef`1 cursor, String[] argv, FSharpFunc`2 other, String usageText, Int32 nargs, FSharpList`1 argSpecs, String arg, FSharpList`1 args)
at Internal.Utilities.ArgParser.ParsePartial(FSharpRef`1 cursor, String[] argv, IEnumerable`1 arguments, FSharpOption`1 otherArgs, FSharpOption`1 usageText)
at Internal.Utilities.ArgParser.Parse(IEnumerable`1 arguments, FSharpOption`1 otherArgs, FSharpOption`1 usageText)
at <StartupCode$fsyacc>.$FSharp.PowerPack.FsYacc.Driver.main@()

最佳答案

抱歉耽搁了这么久,但终于抽出时间来解决这个问题。

编写 FsYacc 的人(F# 团队?)错过了这些功能,从他们在您链接的页面上的评论可以看出。我尝试了几种变体,但这是我唯一能够完成的变体(注意:这需要 .fsy 文件中的 #nowarn "62",它将传播到 .fs 文件,或整个项目的 --nowarn:62:

%{

open Ast

type ('a,'b) Fun = 'a -> 'b

%}

%start startAst

%token <string> MyAst
%token EOF

%type < (bool, MyAst) Fun > startAst

%%

startAst:
| MyAst EOF { (fun (x : bool) ->
if x then
MyAst.Type1 $1
else
MyAst.Type2) }

我不知道为什么(也没有时间查看 FsYacc 的源代码,至少现在没有)。

关于parsing - 如何在使用 F# FsYacc 解析期间添加和使用自定义上下文参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11342379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com