[英]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.