Я хотел бы создать квази-квотер для создания шаблонов, которые соответствуют поддеревьям в Java AST, чтобы вместо BasicFor (Just (ForInitExps init)) (Just cond) (Just inc) body
я мог написать что-то вроде [java|for (#init ; #cond ; #inc) #body|]
.Наивным подходом было бы изменить каждое правило Parsec в синтаксическом анализаторе языка-Java, например:
catch :: P Catch
catch = do
tok KW_Catch
fp <- parens formalParam
b <- block
return $ Catch fp b
становится
catchP :: P TH.Pat
catchP = bindP <|> do
tok KW_Catch
fp <- parens formalParam
b <- block
return $ ConP "Catch" [fp, b]
Где я 1. изменяю сигнатуру типа для получения TH.Pat
;2. добавить альтернативу bindP
для разбора метапеременных (например, #init
, упомянутый выше);3. измените возвращаемое выражение на TH.Pat
вместо Catch
.Я должен был бы сделать это для каждого отдельного правила parsec, которое является довольно много стандартного кода.Есть ли способ отказаться от таких шаблонов?Возможно, используя монаду ParsecT или взломать сам парсек?