From d15d4cf123a1fe28e5b72825c037be70d27a42ca Mon Sep 17 00:00:00 2001 From: XudongXie Date: Sat, 14 Sep 2024 20:16:17 +0800 Subject: [PATCH] add Loop ast classes --- sqlTranslate/.idea/workspace.xml | 41 +++++++++---------- .../main/java/Parser/AST/Loop/ForNode.java | 33 +++++++++++++++ .../java/Parser/AST/Loop/LoopBodyNode.java | 33 +++++++++++++++ .../java/Parser/AST/Loop/LoopEndNode.java | 33 +++++++++++++++ .../java/Parser/AST/Loop/LoopExitNode.java | 33 +++++++++++++++ .../main/java/Parser/AST/Loop/LoopNode.java | 33 +++++++++++++++ .../main/java/Parser/AST/Loop/WhileNode.java | 33 +++++++++++++++ .../src/main/java/Parser/OracleParser.java | 30 +++++++++++++- 8 files changed, 247 insertions(+), 22 deletions(-) create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java create mode 100644 sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index d1a371135..664b0258e 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -4,9 +4,8 @@ - - @@ -487,7 +484,9 @@ - diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java new file mode 100644 index 000000000..c70d1ac3b --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class ForNode extends ASTNode { + public ForNode() { + super(); + setTokens(new ArrayList<>()); + } + + public ForNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public ForNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString() + " "); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java new file mode 100644 index 000000000..84140970f --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class LoopBodyNode extends ASTNode { + public LoopBodyNode() { + super(); + setTokens(new ArrayList<>()); + } + + public LoopBodyNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public LoopBodyNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString() + " "); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java new file mode 100644 index 000000000..895b5a2a1 --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class LoopEndNode extends ASTNode { + public LoopEndNode() { + super(); + setTokens(new ArrayList<>()); + } + + public LoopEndNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public LoopEndNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString()); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java new file mode 100644 index 000000000..76f105c74 --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class LoopExitNode extends ASTNode { + public LoopExitNode() { + super(); + setTokens(new ArrayList<>()); + } + + public LoopExitNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public LoopExitNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString() + " "); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java new file mode 100644 index 000000000..128005399 --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class LoopNode extends ASTNode { + public LoopNode() { + super(); + setTokens(new ArrayList<>()); + } + + public LoopNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public LoopNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString() + " "); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java new file mode 100644 index 000000000..d4e4a775e --- /dev/null +++ b/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java @@ -0,0 +1,33 @@ +package Parser.AST.Loop; + +import Lexer.Token; +import Parser.AST.ASTNode; + +import java.util.ArrayList; +import java.util.List; + +public class WhileNode extends ASTNode { + public WhileNode() { + super(); + setTokens(new ArrayList<>()); + } + + public WhileNode(ASTNode node) { + super(node); + setTokens(new ArrayList<>()); + } + + public WhileNode(List tokens) { + super(tokens); + setTokens(new ArrayList<>()); + } + + @Override + public void visit(ASTNode node, StringBuilder queryString) { + queryString.append(toString()); + for (ASTNode child : getChildren()) + { + child.visit(child, queryString); + } + } +} diff --git a/sqlTranslate/src/main/java/Parser/OracleParser.java b/sqlTranslate/src/main/java/Parser/OracleParser.java index d94c5f5ad..d83c3feaf 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -65,7 +65,14 @@ public class OracleParser { || (lexer.getTokens().get(0).getValue().equalsIgnoreCase("CREATE") && lexer.getTokens().get(1).getValue().equalsIgnoreCase("VIEW")) ) { return parseCreateView(lexer.getTokens()); - } else { + } else if ( + lexer.getTokens().get(0).getValue().equalsIgnoreCase("FOR") + || lexer.getTokens().get(0).getValue().equalsIgnoreCase("LOOP") + || lexer.getTokens().get(0).getValue().equalsIgnoreCase("WHILE") + ) { + return parseLoop(lexer.getTokens()); + } + else { try { throw new ParseFailedException("Parse failed!--Unsupport SQL:" + lexer.getTokens().get(0).getValue()); } catch (ParseFailedException e) { @@ -724,6 +731,27 @@ public class OracleParser { return root; } + /** + * Loop_clauses + * 1:LOOP + * -- + * EXIT WHEN condition; + * END LOOP; + * + * 2:WHILE condition LOOP + * -- + * END LOOP; + * + * 3:FOR counter IN start..stop LOOP + * -- + * END LOOP; + * + * @param parseTokens should start with LOOP | WHILE | FOR + */ + public static ASTNode parseLoop(List parseTokens) { + return null; + } + /** * JOIN clause * For example: table1 t1 JOIN table2 t2 ON|USING t1.id = t2.id