我正在解析同时具有<
和<<
的语言。在我的亚历克斯定义我已经得到的东西,它包含类似在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中表达。不知怎的,你大概可以对它进行编码。 –