Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 我可以将参数传递给我的fsyacc解析器吗?_Parsing_F#_Fsyacc_Fslex_F# Powerpack - Fatal编程技术网

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

Parsing 我可以将参数传递给我的fsyacc解析器吗?,parsing,f#,fsyacc,fslex,f#-powerpack,Parsing,F#,Fsyacc,Fslex,F# Powerpack,我知道可以将参数传递给lexer: rule tokenize scope = parse | whitespace { tokenize scope lexbuf } | newline { newline lexbuf; tokenize scope lexbuf } 但我无法以类似的方式定义解析器开始符号 我试着这样定义它:(感谢提问) 我将scope传递给Lexer,Lexer在创建相关令牌时

我知道可以将参数传递给lexer:

rule tokenize scope = parse
  | whitespace       { tokenize scope lexbuf                       }
  | newline          { newline lexbuf; tokenize scope lexbuf       }
但我无法以类似的方式定义解析器开始符号

我试着这样定义它:(感谢提问)


我将
scope
传递给Lexer,Lexer在创建相关令牌时将其嵌入其中。。。我真的不喜欢这个解决方案,但我还没能想出更好的办法

LexBuffer
中有一个
字典
,也可以通过
parseState
获取。由于没有找到更好的解决方案,我最终将参数存储在那里

我知道这很可能不打算以这种方式使用,也可能在fsyacc的未来版本中不可用,但我现在坚持使用它。如果有人需要这样做,我将创建的两个扩展方法留在这里,以便以更干净的方式访问我的参数:

type IParseState with
    member x.LexBuffer() = x.ParserLocalStore.["LexBuffer"] :?> LexBuffer<char>

type LexBuffer<'a> with
    member x.SomeParameter
        with get() = x.BufferLocalStore.["SomeParameter"] :?> SomeParamType
        and set(v) = x.BufferLocalStore.["SomeParameter"] <- v
键入带有
成员x.LexBuffer()=x.ParserLocalStore。[“LexBuffer”]:?>LexBuffer

键入lexaffer不是答案,但您是否考虑过FParsec?参数传递非常简单,目前还没有。我们还有另一个解析器项目,可能正在使用ANTLR。如果我们(在某个时候)决定在当前项目中也使用ANTLR,那么我可以更轻松地使用fsyacc进行移植。对于解析器组合器(至少据我所知),我没有非常清晰的语法,必须以完全不同的方式进行操作,而fsyacc/ANTLR解析器的大部分结构似乎是相似的。
%token <string * IScope> IDENT
type IParseState with
    member x.LexBuffer() = x.ParserLocalStore.["LexBuffer"] :?> LexBuffer<char>

type LexBuffer<'a> with
    member x.SomeParameter
        with get() = x.BufferLocalStore.["SomeParameter"] :?> SomeParamType
        and set(v) = x.BufferLocalStore.["SomeParameter"] <- v