我正在尝试解析 C++ 代码。因此,我需要一个上下文相关的词法分析器。在 C++ 中,>>
是一个或两个标记(>>
或>
>
),具体取决于上下文。更复杂的是,还有一个令牌>>=
,无论上下文如何,它总是相同的。
punctuation :: Bool -> Parser Token
punctuation expectDoubleGT = do
c <- oneOf "{}[]#()<>%;:.+-*/^&|~!=,"
case c of
'>' ->
(char '=' >> return TokGTEq) <|>
if expectDoubleGT
then (string ">=" >> return TokRShiftEq) <|> return TokGT
else (char '>' >> ((char '=' >> return TokRShiftEq) <|> return TokRShift)) <|> return TokGT
expectDoubleGT
什么时候False
,这个函数工作正常。但是,当expectDoubleGT
是True
(上面的倒数第二行)时,当输入为 时会出错>>
。
*Parse> parseTest (punctuation True) ">"
TokGT
*Parse> parseTest (punctuation True) ">>="
TokRShiftEq
*Parse> parseTest (punctuation True) ">>"
parse error at (line 1, column 2):
unexpected end of input
expecting ">="
当输入为 时,为什么表达式(string ">=" >> return TokRShiftEq) <|> return TokGT
会引发错误而不是返回?(第一个已经用完了)TokGT
>
>