Какой язык является SQL?

Является ли SQL контекстно-свободным языком или каким-либо другим типом языка?

2 ответа

Согласно /questions/39255002/ispolzovanie-regulyarnyih-vyirazhenij-dlya-proverki-operatorov-mysql/39255019#39255019 SQL не является обычным языком. Краткое объяснение состоит в том, что каждый запрос на выборку выглядит так

 SELECT x FROM y WHERE z

а также y может быть другим запросом выбора, поэтому он не может быть смоделирован с помощью конечного автомата. Как упоминалось ранее, существуют некоторые CFG для стандартов SQL в форме Бэкуса-Наура, поэтому SQL является нерегулярным контекстно-свободным языком.

Любой CFG для SQL выполнит большую часть работы, но всегда будет слишком разрешительным.

Хороший пример SQL CFG взят из antlr: https://github.com/antlr/grammars-v4/blob/master/sql/plsql/PlSqlParser.g4

Но в этой строке (1982) вы видите, что в values_clause, значения столбцов добавляются рекурсивно независимо от того, сколько столбцов может быть указано или сколько значений находится в другой строке, что является недопустимым sql:

insert into xyz values
  (1, 'hello'),
  (2, 'bye'),
  (3, 'hi', 'uhm...'); -- invalid!

Попробуйте запустить его здесь: https://www.db-fiddle.com/f/6gwgcg6qBLKpFbCEPtB6dy/0

Этот синтаксис никогда не может быть полностью инкапсулирован CFG, поскольку он эквивалентен { (a^n)(b^n)(c^n) : n ≥ 1 }язык, который, как известно, недопустим в CFG (но разрешен в CSG)

Вы можете утверждать, что это ошибка времени выполнения, а не ошибка синтаксического анализа. Но вы можете использовать один и тот же аргумент для каждого интерпретируемого языка, поэтому это немного серая зона.

@aquinas написал:

Вы имеете в виду, что SQL тоже обычный? CFG охватывает обычные языки. Таким образом, они не являются взаимоисключающими. Чтобы ответить на ваш вопрос, SQL не является обычным языком.

@MSX писал:

Просто для пояснения, язык не зависит от контекста, когда он генерируется грамматикой без контекста. В сети есть контекстные определения грамматики SQL. Просто гуглите вокруг, и вы найдете некоторые. Вот один, например.

Аналогичным в контексте PL/SQL может быть точно, какой код это SQL или PL/SQL, потому что, если мы определяем ключевые слова функций как конкретные, тогда, если мы хотим контролировать, какие функции могут использоваться, этот контекст должен быть известен.

Другие вопросы по тегам