我正在解析同時具有<
和<<
的語言。在我的亞歷克斯定義我已經得到的東西,它包含類似在Happy和Alex中推回令牌
tokens :-
"<" { token Lt }
"<<" { token (BinOp Shl) }
所以每當我遇到<<
,是被符號化的左移和不以低於的。這通常是一件好事,因爲我最終在標記後拋出空白,並且想區分1 < < 2
和1 << 2
。不過,還有其他的時候我希望<<
已經被讀爲兩個<
。例如,我有事情喜歡
<<A>::B>
,我想讀到這樣
< <A> :: B >
很顯然,我可以嘗試調整我的快樂的語法規則,以適應額外的案件,但它可以擴展得厲害。在其他命令式解析器生成器中,我可能會嘗試執行某些操作,比如推回令牌的「部分」(如push_back("<")
,當我遇到<<
但我只需要<
時)。
有沒有其他人有這樣的問題,如果是的話,你是如何處理它的?在快樂中有沒有「推回」令牌的方法?我是否應該試着保留一個空白符號(我實際上傾向於最後一種選擇 - 儘管這是一個非常頭痛的問題,但它會讓我通過確保兩個<
之間沒有空格來處理<<
)。
聰明的主意!雖然我還沒有設法找到Alex獲得兩個代幣的方法,但我可以看到這將如何工作。謝謝! – Alec
@Alec:是的,我只在Parsec中使用過這種技術,你可以向前看(比如'try(運算符<$> char'<'<* notFollowedBy symbol)<|> LeftAngle <$> char'<'')看起來不可能直接在Alex中表達。不知怎的,你大概可以對它進行編碼。 –