SMPCache/AST.py

135 lines
3.8 KiB
Python

#!/usr/bin/env python3
from queryParse import *
import os
import numpy as mp
import sys
import tensorflow as tf
'''
This modult aimed to transfer the infix expression to AST
For example:
Given a [WHERE] subsequence:
'''
class TreeNode:
'''
Define the AST's tree node, each node has three parts:
1. content: the node's content, e.g. 'deposit', 'op5', 50000
2. left: left node
3. right: right node
'''
'''
Construct function
'''
def __init__(self, exp):
self.content = exp
self.left = NULL
self.right = NULL
def priority(a):
'''
This function will return the priority of each operator, if priority greater, the return value will bigger
Operator ReplaceCode
> op0
< op1
== op2
>= op3
<= op4
<> op5
+ op6
- op7
* op8
/ op9
'''
if a in ['ALL', 'ANY', 'BETWEEN', 'LIKE', 'IN', 'OR', 'SOME']:
return 1
if a in ['AND']:
return 2
if a in ['NOT']:
return 3
if a in ['op0', 'op1', 'op2', 'op3', 'op4', 'op5']:
return 4
if a in ['op6', 'op7']:
return 5
if a in ['op8', 'op9']:
return 6
def infix2postfix(exp):
'''
This function will transfer the infix expression to postfix expression
For example:
['deposit', 'op5', '20000', 'AND', '(', 'credit', 'op3', '3', 'OR', 'credit', 'op4', '7', ')']
| | | | |
After transform:
['deposit', '20000', 'credit', '3', 'op3', 'credit', '7', 'op4', 'op5', 'AND']
'''
'''
tuple: Store the infix form for WHERE subquery
'''
op = ['ALL', 'ANY', 'BETWEEN', 'LIKE', 'IN', 'OR', 'SOME', 'AND', 'NOT', 'op0', 'op1', 'op2', 'op3', 'op4', 'op5', 'op6', 'op7', 'op8', 'op9', '(', ')']
tuples = []
for subexp in exp:
for element in subexp:
if element != '':
tuples.append(element.replace(' ', ''))
'''
Define two stacks: stack, postfix
stack-store the operator
postfix-store the postfix
'''
stack = []
postfix = []
for tuple in tuples:
if tuple not in op:
'''
If tuple not in operator, push to the stack
'''
postfix.append(tuple)
else:
if tuple != ')' and (not stack or tuple == '(' or stack[-1] == '('
or priority(tuple) > priority(stack[-1])):
'''
If stack not empty, stack's top is '('
'''
stack.append(tuple)
elif tuple == ')':
'''
If tuple is ')', push into the stack
'''
while True:
temp = stack.pop()
if temp != '(':
postfix.append(temp)
else:
break
else:
'''
Compare the priority of operators to decide whether to push or pop the stack
'''
while True:
if stack and stack[-1] != '(' and priority(tuple) <= priority(stack[-1]):
postfix.append(stack.pop())
else:
stack.append(tuple)
break
while stack:
'''
If stack is not empty, all remaining elements are pushed into the postfix stack
'''
postfix.append(stack.pop())
return postfix
def AST():
'''
This function will build the expression AST according to postfix expression
'''
node = TreeNode("")