forked from opengaussexamples/examples
add IF ELSIF
This commit is contained in:
parent
3f81250c9c
commit
86b3eee863
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue