Happy & Alex - 防止前瞻影响解析器-词法分析器通信

Happy & Alex - Preventing the lookahead from affecting parser-lexer communication

我目前正在为玩具语言的编译器编写解析器 使用 Happy & Alex。由于需要某种形式的可选布局,我必须更改 Alex 在匹配 block 非终结符之前的状态。很遗憾 似乎之前读取了 Happy 所需的前瞻令牌 我有机会改变亚历克斯的状态。

这是一个演示问题的小片段:

funcDef : header localDefs block
                          ^ I have to change alex's state 
                            before the underlying lexer
                            starts reading the block tokens.

是否有解决此问题的通用方法?

我假设您正在使用线程词法分析器(因此 Happy 和 Alex 运行 在同一个 monad 中)。我在遇到类似问题时使用的技巧是制作一个空的生产规则,然后将其放入您的规则中。

changeAlexState :: { () }
  : {- empty -} {%% \tok -> changeAlexState *> pushTok tok }

funcDef : header localDefs changeAlexState block

然后,您需要向您的 monad 添加一些状态以支持 pushTok :: Token -> P ()(其中 P 是您的 lexing/parsing monad)并确保您始终弹出该标记正在学习。 %% 所做的是 documented here

n : t_1 ... t_n {%% <expr> }

... The type of <expr> is the same [still Token -> P a], but in this case the lookahead token is actually discarded and a new token is read from the input. This can be useful when you want to change the next token and continue parsing.

我提到我不久前做过类似的事情。 Here is my "empty" rule, here is an example use of it, here is where my pushing function is defined and here is where I "pop" tokens。让我知道进展如何!