我知道可以向词法分析器传递参数:
rule tokenize scope = parse
| whitespace { tokenize scope lexbuf }
| newline { newline lexbuf; tokenize scope lexbuf }
但是我无法以类似的方式定义我的解析器起始符号。
我尝试像这样定义它:(感谢this问题)
%type < (IScope, AST.Script) Fun > Script
// with the following definition in the head section of the parser:
type ('a,'b) Fun = 'a -> 'b
但是我需要这样定义每个非终端符号,并且它们都返回lambda。这不是我想要实现的,我希望能够在解析过程中访问“scope”参数并执行它们的操作。
我注意到IParseState类型中有一个“ParserLocalStore”,其中仅包含“LexBuffer”(仅通过调试进行检查)。由于我可以通过每个非终端符号中的“parseState”访问它,所以我可以在其中存储参数吗?或者那是一个坏主意?
我考虑在解析器的头部使用可变变量,但它们会是静态的(我认为?),这将阻止我同时解析多个输入... 编辑: 目前我将“scope”参数存储在特定的标记中:
%token <string * IScope> IDENT
我将scope
传递给词法分析器,当它创建相关的标记时,将其嵌入其中...我真的不喜欢这个解决方案,但我还没有想到更好的方法。