C++コードを解析しようとしています。したがって、コンテキスト依存のレクサーが必要です。C ++では、コンテキストに応じて、>>
1つまたは2つのトークン(>>
または)です。>
>
さらに複雑にするために>>=
、コンテキストに関係なく常に同じであるトークンもあります。
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
(上の最後から2行目)の場合、入力が。の場合はエラーになります>>
。
*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
>
>