SQL是无上下文的语言还是其他类型的语言?
答案 0 :(得分:6)
根据https://stackoverflow.com/a/31265136 SQL不是常规语言。简短的解释是每个选择查询看起来像
SELECT x FROM y WHERE z
和y
本身可以是另一个选择查询,因此无法使用有限状态机进行模拟。如前所述,Backus–Naur Form中的SQL标准有一些CFG,因此SQL是非正规上下文语言。
答案 1 :(得分:2)
@aquinas写道:
你的意思是SQL也经常吗? CFG包含常规语言。所以,他们并不是互相排斥的。但要回答你的问题,SQL不是常规语言。
@MSX写道:
只是澄清一下,当语言由无上下文语法生成时,语言是无上下文的。在线有无SQL上下文语法定义。只是谷歌周围,你会发现一些。例如,Here's一个。
答案 2 :(得分:0)
任何用于SQL的CFG都可以完成大部分工作,但总是有些许限制。
一个很好的SQL CFG示例来自antlr:https://github.com/antlr/grammars-v4/blob/master/sql/plsql/PlSqlParser.g4#L1982
但是在那一行(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(but allowed in CSGs)不允许使用这种语言
您可以说这是运行时错误而不是解析错误。但是您可以对每种解释的语言使用相同的参数,因此它有点灰色。
答案 3 :(得分:-1)
在PL / SQL上下文中类似,可以确切地表示它是SQL或PL / SQL的代码 因为如果我们将功能关键字定义为具体关键字,那么如果我们想控制 可以使用哪些功能,必须知道此上下文