Расширить синтаксический анализатор, чтобы построить квази-квотер для шаблонов - PullRequest
0 голосов
/ 09 февраля 2019

Я хотел бы создать квази-квотер для создания шаблонов, которые соответствуют поддеревьям в 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 или взломать сам парсек?

...