我正在解析一种同时具有<
和的语言<<
。在我的亚历克斯定义中,我有一些包含类似的东西
tokens :-
"<" { token Lt }
"<<" { token (BinOp Shl) }
所以每当我遇到 时<<
,它都会被标记为左移而不是小于。这通常是一件好事,因为我最终在标记化后丢弃了空格并想要区分1 < < 2
和1 << 2
。然而,还有其他时候我希望<<
被读为两个<
。例如,我有类似的东西
<<A>::B>
我想读
< < A > :: B >
显然,我可以尝试调整我的 Happy 解析器规则以适应额外的情况,但这扩展性很差。在其他命令式解析器生成器中,我可能会尝试执行诸如推回令牌的“部分”之类的操作(例如push_back("<")
当我遇到<<
但我只需要时<
)。
有没有其他人遇到过这样的问题,如果有,您是如何处理的?兴欣中是否有“推回”代币的方法?我是否应该尝试保留一个空格标记(我实际上倾向于最后一种选择 - 尽管这是一个非常令人头疼的问题,但它会让我<<
通过确保两者之间没有空格来处理<
)。