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