add IF ELSIF

This commit is contained in:
XudongXie 2024-09-14 15:26:01 +08:00
parent 3f81250c9c
commit 86b3eee863
9 changed files with 141 additions and 20 deletions

View File

@ -6,10 +6,10 @@
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add IF ELSIF"> <list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add IF ELSIF">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/ASTNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/ASTNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Main.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSENode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSENode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSENode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSENode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSIFConditionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSIFConditionNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSIFConditionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSIFConditionNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ElSIFActionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ElSIFActionNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ElSIFActionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/ELSIFActionNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/EndIFNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/EndIFNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/EndIFNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/EndIFNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFActionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFActionNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFActionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFActionNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFConditionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFConditionNode.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFConditionNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/IFELSIF/IFConditionNode.java" afterDir="false" />
@ -111,13 +111,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1723106789329</updated> <updated>1723106789329</updated>
</task> </task>
<task id="LOCAL-00018" summary="coding">
<created>1724507228242</created>
<option name="number" value="00018" />
<option name="presentableId" value="LOCAL-00018" />
<option name="project" value="LOCAL" />
<updated>1724507228242</updated>
</task>
<task id="LOCAL-00019" summary="coding"> <task id="LOCAL-00019" summary="coding">
<created>1724510094392</created> <created>1724510094392</created>
<option name="number" value="00019" /> <option name="number" value="00019" />
@ -454,7 +447,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1726241748943</updated> <updated>1726241748943</updated>
</task> </task>
<option name="localTasksCounter" value="67" /> <task id="LOCAL-00067" summary="add IF ELSIF">
<created>1726284970450</created>
<option name="number" value="00067" />
<option name="presentableId" value="LOCAL-00067" />
<option name="project" value="LOCAL" />
<updated>1726284970451</updated>
</task>
<option name="localTasksCounter" value="68" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">

View File

@ -32,12 +32,22 @@ public class Main {
// ");"; // ");";
// String sql = "ALTER TABLE employees ADD email VARCHAR2(100) Check (email != '12813@163.com');"; // String sql = "ALTER TABLE employees ADD email VARCHAR2(100) Check (email != '12813@163.com');";
// String sql = "CASE WHEN column2 > 0 THEN 'Positive' ELSE 'Non-positive' END"; // String sql = "CASE WHEN column2 > 0 THEN 'Positive' ELSE 'Non-positive' END";
String sql = "CREATE OR REPLACE VIEW emp_dept_info AS SELECT e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d Using e.department_id = d.department_id;"; // String sql = "CREATE OR REPLACE VIEW emp_dept_info AS SELECT e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d Using e.department_id = d.department_id;";
String sql = "IF v_salary >= 100000 THEN\n" +
" v_bonus := v_salary * 0.1;\n" +
" ELSIF v_salary >= 50000 THEN\n" +
" v_bonus := v_salary * 0.08;\n" +
" ELSIF v_salary >= 30000 THEN\n" +
" v_bonus := v_salary * 0.05;\n" +
" ELSE\n" +
" v_bonus := v_salary * 0.03;\n" +
" END IF;";
OracleLexer lexer = new OracleLexer(sql); OracleLexer lexer = new OracleLexer(sql);
lexer.printTokens(); lexer.printTokens();
OracleParser parser = new OracleParser(lexer); // OracleParser parser = new OracleParser(lexer);
ASTNode root = parser.parse(); // ASTNode root = parser.parse();
// ASTNode root = parser.parseCaseWhen(lexer.getTokens()); ASTNode root = OracleParser.parseIFELSE(lexer.getTokens());
// ASTNode root = OracleParser.parseCaseWhen(lexer.getTokens());
// ASTNode root = OracleParser.parseJoin(lexer.getTokens()); // ASTNode root = OracleParser.parseJoin(lexer.getTokens());
System.out.println(root.toQueryString()); System.out.println(root.toQueryString());
System.out.println(root.getASTString()); System.out.println(root.getASTString());

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ELSENode extends ASTNode { public class ELSENode extends ASTNode {
public ELSENode() { public ELSENode() {
super(); super();
setTokens(new ArrayList<>());
} }
public ELSENode(ASTNode node) { public ELSENode(ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public ELSENode(List<Token> tokens) { public ELSENode(List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ElSIFActionNode extends ASTNode { public class ELSIFActionNode extends ASTNode {
public ElSIFActionNode() { public ELSIFActionNode() {
super(); super();
setTokens(new ArrayList<>());
} }
public ElSIFActionNode(ASTNode node) { public ELSIFActionNode(ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public ElSIFActionNode(List<Token> tokens) { public ELSIFActionNode(List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ELSIFConditionNode extends ASTNode { public class ELSIFConditionNode extends ASTNode {
public ELSIFConditionNode() { public ELSIFConditionNode() {
super(); super();
setTokens(new ArrayList<>());
} }
public ELSIFConditionNode(ASTNode node) { public ELSIFConditionNode(ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public ELSIFConditionNode(List<Token> tokens) { public ELSIFConditionNode(List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class EndIFNode extends ASTNode { public class EndIFNode extends ASTNode {
public EndIFNode() { public EndIFNode() {
super(); super();
setTokens(new ArrayList<>());
} }
public EndIFNode (ASTNode node) { public EndIFNode (ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public EndIFNode (List<Token> tokens) { public EndIFNode (List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class IFActionNode extends ASTNode { public class IFActionNode extends ASTNode {
public IFActionNode() { public IFActionNode() {
super(); super();
setTokens(new ArrayList<>());
} }
public IFActionNode(ASTNode node) { public IFActionNode(ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public IFActionNode(List<Token> tokens) { public IFActionNode(List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -3,19 +3,23 @@ package Parser.AST.IFELSIF;
import Lexer.Token; import Lexer.Token;
import Parser.AST.ASTNode; import Parser.AST.ASTNode;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class IFConditionNode extends ASTNode { public class IFConditionNode extends ASTNode {
public IFConditionNode() { public IFConditionNode() {
super(); super();
setTokens(new ArrayList<>());
} }
public IFConditionNode(ASTNode node) { public IFConditionNode(ASTNode node) {
super(node); super(node);
setTokens(new ArrayList<>());
} }
public IFConditionNode(List<Token> tokens) { public IFConditionNode(List<Token> tokens) {
super(tokens); super(tokens);
setTokens(new ArrayList<>());
} }
@Override @Override

View File

@ -18,7 +18,7 @@ import Parser.AST.Drop.DropEndNode;
import Parser.AST.Drop.DropObjNameNode; import Parser.AST.Drop.DropObjNameNode;
import Parser.AST.Drop.DropNode; import Parser.AST.Drop.DropNode;
import Parser.AST.Drop.DropOptionNode; import Parser.AST.Drop.DropOptionNode;
import Parser.AST.IFELSIF.IFConditionNode; import Parser.AST.IFELSIF.*;
import Parser.AST.Insert.InsertDataNode; import Parser.AST.Insert.InsertDataNode;
import Parser.AST.Insert.InsertEndNode; import Parser.AST.Insert.InsertEndNode;
import Parser.AST.Insert.InsertNode; import Parser.AST.Insert.InsertNode;
@ -554,9 +554,96 @@ public class OracleParser {
*/ */
public static ASTNode parseIFELSE(List<Token> parseTokens) { public static ASTNode parseIFELSE(List<Token> parseTokens) {
ASTNode root = new IFConditionNode(); ASTNode root = new IFConditionNode();
ASTNode currentNode = root;
for (int i = 0; i < parseTokens.size(); i++) { for (int i = 0; i < parseTokens.size(); i++) {
// TODO: implement // match IF condition
if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("IF")) {
for (int j = i; j < parseTokens.size(); j++) {
if (parseTokens.get(j).hasType(Token.TokenType.KEYWORD) && parseTokens.get(j).getValue().equalsIgnoreCase("THEN")) {
i = j - 1;
break;
}
root.addToken(parseTokens.get(j));
}
}
// match IF action
else if (currentNode instanceof IFConditionNode && parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("THEN")) {
ASTNode childNode = new IFActionNode();
for (int j = i; j < parseTokens.size(); j++) {
childNode.addToken(parseTokens.get(j));
if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equals(";")) {
i = j;
break;
}
}
currentNode.addChild(childNode);
currentNode = childNode;
}
// match ELSIF condition
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("ELSIF")) {
ASTNode childNode = new ELSIFConditionNode();
for (int j = i; j < parseTokens.size(); j++) {
if (parseTokens.get(j).hasType(Token.TokenType.KEYWORD) && parseTokens.get(j).getValue().equalsIgnoreCase("THEN")) {
i = j - 1;
break;
}
childNode.addToken(parseTokens.get(j));
}
currentNode.addChild(childNode);
currentNode = childNode;
}
// match ELSIF action
else if (currentNode instanceof ELSIFConditionNode && parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("THEN")) {
ASTNode childNode = new ELSIFActionNode();
for (int j = i; j < parseTokens.size(); j++) {
childNode.addToken(parseTokens.get(j));
if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equals(";")) {
i = j;
break;
}
}
currentNode.addChild(childNode);
currentNode = childNode;
}
// match ELSE
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("ELSE")) {
ASTNode childNode = new ELSENode();
for (int j = i; j < parseTokens.size(); j++) {
childNode.addToken(parseTokens.get(j));
if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equals(";")) {
i = j;
break;
}
}
currentNode.addChild(childNode);
currentNode = childNode;
}
//match end if;
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("END")) {
ASTNode childNode = new EndIFNode();
for (int j = i; j < parseTokens.size(); j++) {
childNode.addToken(parseTokens.get(j));
if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equals(";")) {
i = j;
break;
}
}
currentNode.addChild(childNode);
currentNode = childNode;
}
else if (parseTokens.get(i).hasType(Token.TokenType.EOF)) {
break;
}
else {
try {
throw new ParseFailedException("Parse failed!--" + parseTokens.get(i).getValue());
}
catch (ParseFailedException e) {
e.printStackTrace();
}
}
} }
return root; return root;
} }