Почему моя простая грамматика SQL не может разобрать в Brag? - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь создать синтаксический анализатор для простого подмножества SQL, используя грамматику, написанную на языке BNF на языке Brag.Мой код Brag выглядит следующим образом:

#lang brag
statement : "select" fields "from" source joins* filters*
fields    : field ("," field)*
field     : WORD
source    : WORD
joins     : join* 
join      : "join" source "on" "(" condition ")"
filters   : "where" condition ("and" | "or" condition)*
condition : field "=" field

Но когда я пытаюсь использовать эту грамматику для анализа базового оператора SQL, я сталкиваюсь со следующей ошибкой:

> (parse-to-datum "select * from table")
Encountered unexpected token of type "s" (value "s") while parsing 'unknown [line=#f, column=#f, offset=#f]

I'mабсолютный новичок в грамматике и хвастовстве.Есть идеи, что я делаю неправильно?

1 Ответ

2 голосов
/ 22 сентября 2019

Вам нужно сначала лексировать / токенизировать строку.Входные данные для 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 , например, может сразу же проанализировать строку для данных (или синтаксических данных), хотя в функциональном программировании используется некоторая продвинутая концепция, поэтому втак что это может быть более сложным в использовании.

...