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">
<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$/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/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/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" />
@ -111,13 +111,6 @@
<option name="presentableId" value="Default" />
<updated>1723106789329</updated>
</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">
<created>1724510094392</created>
<option name="number" value="00019" />
@ -454,7 +447,14 @@
<option name="project" value="LOCAL" />
<updated>1726241748943</updated>
</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 />
</component>
<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 = "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);
lexer.printTokens();
OracleParser parser = new OracleParser(lexer);
ASTNode root = parser.parse();
// ASTNode root = parser.parseCaseWhen(lexer.getTokens());
// OracleParser parser = new OracleParser(lexer);
// ASTNode root = parser.parse();
ASTNode root = OracleParser.parseIFELSE(lexer.getTokens());
// ASTNode root = OracleParser.parseCaseWhen(lexer.getTokens());
// ASTNode root = OracleParser.parseJoin(lexer.getTokens());
System.out.println(root.toQueryString());
System.out.println(root.getASTString());

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -18,7 +18,7 @@ import Parser.AST.Drop.DropEndNode;
import Parser.AST.Drop.DropObjNameNode;
import Parser.AST.Drop.DropNode;
import Parser.AST.Drop.DropOptionNode;
import Parser.AST.IFELSIF.IFConditionNode;
import Parser.AST.IFELSIF.*;
import Parser.AST.Insert.InsertDataNode;
import Parser.AST.Insert.InsertEndNode;
import Parser.AST.Insert.InsertNode;
@ -554,9 +554,96 @@ public class OracleParser {
*/
public static ASTNode parseIFELSE(List<Token> parseTokens) {
ASTNode root = new IFConditionNode();
ASTNode currentNode = root;
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;
}