我在F#应用程序中使用FsLex和FsYacc进行字符串解析。在创建抽象语法树(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 [email protected](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#团队?)都错过了这些功能,可以通过他们在链接页面上的评论看到。我尝试了几种变体,但这是我唯一能做的变体(请注意:这需要#nowarn "62"文件中的.fsy,它将传播到.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/

10-09 13:55