簡體   English   中英

Happy&Alex - 防止先行者影響解析器 - 詞法分析器通信

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

我目前正在使用Happy&Alex編寫一個玩具語言編譯器的解析器。 由於需要某種形式的可選布局,我必須在匹配block非終端之前更改Alex的狀態。 不幸的是,在我有機會改變亞歷克斯的狀態之前,似乎已經閱讀了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)並確保你在lexing時總是彈出那個標記。 這里記錄了 %%作用。

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

... <expr>的類型相同[仍然是Token -> P a ],但在這種情況下,實際上會丟棄先行令牌並從輸入中讀取新令牌。 當您想要更改下一個標記並繼續解析時,這非常有用。

我提到我不久前做了類似的事情。 這是我的“空”規則這是一個使用它的示例這里是我的推送功能定義的地方這里是我“彈出”令牌的地方 讓我知道事情的后續!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM