Я рассматривал возможность использования библиотеки синтаксического анализа Parsec на Haskell для анализа подмножества Java в качестве анализатора рекурсивного спуска в качестве альтернативы более традиционным решениям генератора-анализатора, таким как Happy.Parsec кажется очень простым в использовании, и скорость разбора для меня определенно не имеет значения.Мне интересно, однако, возможно ли реализовать «резервное копирование» с помощью Parsec, методики, которая находит правильный продукт для использования, пробуя каждый по очереди.В качестве простого примера рассмотрим начало Java-грамматики JLS:
Literal:
IntegerLiteral
FloatingPointLiteral
Мне бы хотелось, чтобы не нужно было выяснять, как мне упорядочить эти два правила, чтобы синтаксический анализ был успешным.В таком виде наивная реализация, подобная этой:
literal = do {
x <- try (do { v <- integer; return (IntLiteral v)}) <|>
(do { v <- float; return (FPLiteral v)});
return(Literal x)
}
не будет работать ... вводы типа «15.2» приведут к успешному выполнению целочисленного синтаксического анализатора, а затем все будет подавлено «."условное обозначение.В этом случае, конечно, очевидно, что вы можете решить проблему, переупорядочив два производства.Однако в общем случае поиск таких вещей будет кошмаром, и очень вероятно, что я пропущу некоторые случаи.В идеале, я бы хотел, чтобы Парсек разбирался с такими вещами для меня.Возможно ли это, или я просто пытаюсь сделать слишком много с библиотекой?В документации Parsec утверждается, что он может "анализировать контекстно-зависимые, бесконечные прогнозные грамматики", поэтому мне кажется, что я должен кое-что здесь сделать.