gpt4 book ai didi

python - 使用PLY解析SQL语句

转载 作者:太空狗 更新时间:2023-10-29 21:50:49 26 4
gpt4 key购买 nike

我知道还有其他工具可以解析 SQL 语句,但出于教育目的,我正在推出自己的工具。我现在被语法困住了。如果您能很快发现错误,请告诉我。

SELECT = r'SELECT'
FROM = r'FROM'
COLUMN = TABLE = r'[a-zA-Z]+'
COMMA = r','
STAR = r'\*'
END = r';'
t_ignore = ' ' #ignores spaces

statement : SELECT columns FROM TABLE END

columns : STAR
| rec_columns

rec_columns : COLUMN
| rec_columns COMMA COLUMN

当我尝试解析像“SELECT a FROM b;”这样的语句时我在 FROM token 处遇到语法错误...非常感谢任何帮助!

(编辑)代码:

#!/usr/bin/python
import ply.lex as lex
import ply.yacc as yacc

tokens = (
'SELECT',
'FROM',
'WHERE',
'TABLE',
'COLUMN',
'STAR',
'COMMA',
'END',
)

t_SELECT = r'select|SELECT'
t_FROM = r'from|FROM'
t_WHERE = r'where|WHERE'
t_TABLE = r'[a-zA-Z]+'
t_COLUMN = r'[a-zA-Z]+'
t_STAR = r'\*'
t_COMMA = r','
t_END = r';'

t_ignore = ' \t'

def t_error(t):
print 'Illegal character "%s"' % t.value[0]
t.lexer.skip(1)

lex.lex()

NONE, SELECT, INSERT, DELETE, UPDATE = range(5)
states = ['NONE', 'SELECT', 'INSERT', 'DELETE', 'UPDATE']
current_state = NONE

def p_statement_expr(t):
'statement : expression'
print states[current_state], t[1]

def p_expr_select(t):
'expression : SELECT columns FROM TABLE END'
global current_state
current_state = SELECT
print t[3]


def p_recursive_columns(t):
'''recursive_columns : recursive_columns COMMA COLUMN'''
t[0] = ', '.join([t[1], t[3]])

def p_recursive_columns_base(t):
'''recursive_columns : COLUMN'''
t[0] = t[1]

def p_columns(t):
'''columns : STAR
| recursive_columns'''
t[0] = t[1]

def p_error(t):
print 'Syntax error at "%s"' % t.value if t else 'NULL'
global current_state
current_state = NONE

yacc.yacc()


while True:
try:
input = raw_input('sql> ')
except EOFError:
break
yacc.parse(input)

最佳答案

我认为您的问题是t_TABLEt_COLUMN 的正则表达式也匹配您的保留字(SELECT 和FROM)。换句话说,SELECT a FROM b; 标记为 COLUMN COLUMN COLUMN COLUMN END(或其他一些模棱两可的标记化),这与您的任何作品都不匹配,因此你得到一个语法错误。

作为快速完整性检查,更改这些正则表达式以完全匹配您输入的内容,如下所示:

t_TABLE = r'b'
t_COLUMN = r'a'

您将看到语法 SELECT a FROM b; 通过,因为正则表达式“a”和“b”与您的保留字不匹配。

还有另一个问题,TABLE 和 COLUMN 的正则表达式也重叠,因此词法分析器也无法对这些标记进行无歧义的标记。

有一个 subtle, but relevant section in the PLY documentation对此。不确定解释这一点的最佳方法,但诀窍是 token 化过程首先发生,因此它不能真正使用生产规则中的上下文来了解它是否遇到了 TABLE token 或 COLUMN token 。您需要将它们归纳为某种 ID 标记,然后在解析过程中将其剔除。

如果我有更多的精力,我会尝试更多地研究您的代码并提供代码中的实际解决方案,但我认为既然您已经表示这是一个学习练习,也许您会满意我指出了正确的方向。

关于python - 使用PLY解析SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7355493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com