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