Вам нужно сначала лексировать / токенизировать строку.Входные данные для parse
/ parse-to-datum
должны быть списком токенов.Кроме того, brag чувствителен к регистру, что означает, что ввод должен быть select
, а не SELECT
.После того, как вы это сделаете, оно должно работать:
> (parse-to-datum (list "select"
(token 'WORD "foo")
"from "
(token 'WORD "bar")
" "
" "))
'(statement "select" (fields (field "foo")) "from " (source "bar") " " " ")
Для проблемы чувствительности к регистру это не проблема, так как вы можете выполнить нормализацию на этапе токенизации.
Ваша грамматика выглядитстранно, однако.Вы, вероятно, не должны иметь дело с пробелами.Вместо этого, пробел должен аналогичным образом обрабатываться на этапе токенизации.
См. https://beautifulracket.com/bf/the-tokenizer-and-reader.html для получения дополнительной информации о токенизации.
Альтернативная возможность состоит в использовании других анализаторов.,https://docs.racket -lang.org / megaparsack / index.html , например, может сразу же проанализировать строку для данных (или синтаксических данных), хотя в функциональном программировании используется некоторая продвинутая концепция, поэтому втак что это может быть более сложным в использовании.