मैं जानता हूँ कि वहाँ अन्य उपकरणों SQL कथन पार्स करने के लिए कर रहे हैं, लेकिन मैं शैक्षिक उद्देश्यों के लिए अपने खुद के बाहर चल रहा पार्स करने के लिए प्लाई का उपयोग करना। मैं अभी अपने व्याकरण से फंस रहा हूं .. अगर आप वास्तव में एक त्रुटि खोज सकते हैं तो कृपया मुझे बताएं।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
जब मैं 'से चुनें एक बी;' जैसे किसी बयान को पार्स करने का प्रयास करता हूं। मुझे FROM टोकन पर एक वाक्यविन्यास त्रुटि मिलती है ... किसी भी मदद की बहुत सराहना की जाती है!
(संपादित करें) कोड:
#!/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)
यदि आप 'बी' और'; 'के बीच कोई स्थान डालते हैं तो क्या होगा? – zerkms
फिर भी एक ही परिणाम है, मैं जोड़ने कि यह रिक्त स्थान पर ध्यान नहीं देता ... मुझे लगता है कि संपादित करेंगे में भूल गया। – sampwing
जहाँ तक मुझे पता है, सबसे डेटाबेस में कम से कम '[a-zA-Z_0-9]' तालिका के रूप में समर्थन करेंगे नाम। – NullUserException