Parsing 我可以将参数传递给我的fsyacc解析器吗?
我知道可以将参数传递给lexer: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在创建相关令牌时
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