我在 F# 应用程序中使用FsLex和FsYacc进行字符串解析。在抽象语法树 (AST) 创建期间,解析器必须决定如何创建 AST(制作不同的树、抛出异常等)。解析器行为必须依赖于几个参数。
在这里,我发现允许声明如下内容:
%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)
提前致谢
更新以下异常并在 fsycc.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@()