This commit is contained in:
XudongXie 2024-08-20 22:38:16 +08:00
parent 33978043c6
commit 18ded7e870
14 changed files with 175 additions and 52 deletions

View File

@ -4,16 +4,20 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add AST node">
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/ColumnNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/EndNode.java" afterDir="false" />
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add functions">
<change afterPath="$PROJECT_DIR$/src/main/java/Exception/ParseFailedException.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.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/CreateTabNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CreateTabNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/TableTypeNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableTypeNode.java" 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/Parser/AST/CreateTable/ColumnNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/ColumnNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CreateTabNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CreateTabNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableTypeNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/TableTypeNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/EndNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CRTEndNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/SelectStatementNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/SelectStatementNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@ -136,7 +140,14 @@
<option name="project" value="LOCAL" />
<updated>1723992163694</updated>
</task>
<option name="localTasksCounter" value="5" />
<task id="LOCAL-00005" summary="add functions">
<created>1724145125754</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1724145125754</updated>
</task>
<option name="localTasksCounter" value="6" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -155,6 +166,7 @@
<MESSAGE value="lexer" />
<MESSAGE value="AST node" />
<MESSAGE value="add AST node" />
<option name="LAST_COMMIT_MESSAGE" value="add AST node" />
<MESSAGE value="add functions" />
<option name="LAST_COMMIT_MESSAGE" value="add functions" />
</component>
</project>

View File

@ -40,6 +40,14 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,8 @@
package Exception;
public class ParseFailedException extends RuntimeException{
public ParseFailedException(String message)
{
super(message);
}
}

View File

@ -1,4 +1,13 @@
package Generator;
import Parser.AST.ASTNode;
public class OpenGaussGenerator {
private ASTNode node;
public OpenGaussGenerator(ASTNode node) {
this.node = node;
}
public String generate() {
return node.toQueryString();
}
}

View File

@ -10,7 +10,7 @@ import java.util.regex.Pattern;
public class OracleLexer {
public static final String[] keywords = {"SELECT", "FROM", "WHERE", "AND", "OR", "INSERT", "UPDATE", "DELETE",
// keywords of creating table
"CREATE", "TABLE", "TEMPORARY",
"CREATE", "TABLE", "TEMPORARY", "GLOBAL",
"NUMBER", "INTEGER", "SMALLIN", "BINARY_INTEGER", "DECIMAL", "REAL", "FLOAT", "DOUBLE PRECISION", "CHAR", "VARCHAR2",
"NCHAR", "NVARCHAR2", "CLOB", "NCLOB", "DATE", "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE", "BLOB", "RAW",
"LONG RAW", "BOOLEAN", "INTERVAL YEAR TO MONTH", "INTERVAL DAY TO SECOND", "ROWID", "UROWID", "REF CURSOR",
@ -138,4 +138,8 @@ public class OracleLexer {
System.out.println(token);
}
}
public List<Token> getTokens() {
return tokens;
}
}

View File

@ -6,26 +6,26 @@ import java.util.ArrayList;
import java.util.List;
public abstract class ASTNode {
private Token token;
private List<Token> tokens;
private ASTNode parent;
private List<ASTNode> children = new ArrayList<>();
public ASTNode(Token token) {
this.token = token;
public ASTNode(List<Token> tokens) {
this.tokens = tokens;
}
public ASTNode(ASTNode node) {
this.token = node.token;
this.tokens = node.tokens;
this.parent = node.parent;
this.children = new ArrayList<>(node.children);
}
public Token getToken() {
return token;
public List<Token> getTokens() {
return tokens;
}
public void setToken(Token token) {
this.token = token;
public void setTokens(List<Token> tokens) {
this.tokens = tokens;
}
public ASTNode getParent() {
@ -66,7 +66,7 @@ public abstract class ASTNode {
*/
public void setChildrenByName(String childName, ASTNode child) {
for (int i = 0; i < this.children.size(); i++) {
if (this.children.get(i).getToken().getValue().contains(childName)) {
if (this.children.get(i).toString().contains(childName)) {
this.children.set(i, child);
break;
}
@ -103,6 +103,13 @@ public abstract class ASTNode {
@Override
public String toString() {
return token.getValue();
String str = "";
for (int i = 0; i < tokens.size(); i++) {
if (i < tokens.size() - 1)
str += tokens.get(i).getValue() + " ";
else
str += tokens.get(i).getValue();
}
return str;
}
}

View File

@ -1,18 +1,21 @@
package Parser.AST;
package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
public class EndNode extends ASTNode{
public EndNode(ASTNode node)
import java.util.List;
public class CRTEndNode extends ASTNode {
public CRTEndNode(ASTNode node)
{
super(node);
}
public EndNode(Token token)
public CRTEndNode(List<Token> tokens)
{
super(token);
super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(")" + getToken().getValue());
queryString.append(")" + toString());
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
import java.util.List;
public class ColumnNode extends ASTNode {
public ColumnNode(ASTNode node)
{
super(node);
}
public ColumnNode(Token token)
public ColumnNode(List<Token> tokens)
{
super(token);
super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(getToken().getValue() + " ");
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -2,25 +2,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
import java.util.List;
public class CreateTabNode extends ASTNode {
public CreateTabNode(ASTNode node) {
super(node);
}
public CreateTabNode(Token token) {
super(token);
public CreateTabNode(List<Token> tokens) {
super(tokens);
}
@Override
public void visit(ASTNode node, StringBuilder queryString) {
// judge the type of the table
if (getChildren().get(0) instanceof TableTypeNode) {
queryString.append("CREATE ");
}
else {
queryString.append("CREATE TABLE ");
}
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
import java.util.List;
public class TableConstraintNode extends ASTNode{
public TableConstraintNode(ASTNode node)
{
super(node);
}
public TableConstraintNode(Token token)
public TableConstraintNode(List<Token> tokens)
{
super(token);
super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(getToken().getValue() + " ");
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
import java.util.List;
public class TableNode extends ASTNode{
public TableNode(ASTNode node)
{
super(node);
}
public TableNode(Token token)
public TableNode(List<Token> tokens)
{
super(token);
super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(getToken().getValue() + " ");
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
import java.util.List;
public class TableTypeNode extends ASTNode {
public TableTypeNode(ASTNode node)
{
super(node);
}
public TableTypeNode(Token token)
public TableTypeNode(List<Token> tokens)
{
super(token);
super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(getToken() + " ");
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -2,21 +2,23 @@ package Parser.AST;
import Lexer.Token;
import java.util.List;
public class SelectStatementNode extends ASTNode{
public SelectStatementNode(ASTNode node)
{
super(node);
}
public SelectStatementNode(Token token)
public SelectStatementNode(List<Token> tokens)
{
super(token);
super(tokens);
}
@Override
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append("SELECT ");
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -1,17 +1,83 @@
package Parser;
import Lexer.OracleLexer;
import Lexer.Token;
import Parser.AST.ASTNode;
import Exception.ParseFailedException;
import Parser.AST.CreateTable.CreateTabNode;
import Parser.AST.CreateTable.TableNode;
import Parser.AST.CreateTable.TableTypeNode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class OracleParser {
private OracleLexer lexer;
public OracleParser(OracleLexer lexer) {
this.lexer = lexer;
}
public ASTNode parse(String input)
public ASTNode parse()
{
List<Token> tokens = lexer.getTokens();
// check if the input is a create table statement
if ((tokens.get(0).getValue().equalsIgnoreCase("CREATE") && tokens.get(1).getValue().equalsIgnoreCase("TABLE")) ||
(tokens.get(0).getValue().equalsIgnoreCase("CREATE") && tokens.get(2).getValue().equalsIgnoreCase("TEMPORARY") && tokens.get(3).getValue().equalsIgnoreCase("TABLE")) ) {
return parseCreateTab();
}
else {
throw new ParseFailedException("Parse failed!");
}
}
return null;
private ASTNode parseCreateTab() {
List <Token> tokens = new ArrayList<>();
tokens.add(lexer.getTokens().get(0));
ASTNode root = new CreateTabNode(tokens);
ASTNode currentNode = root;
for (int i = 1; i < lexer.getTokens().size(); i++) {
if (i == 1 && lexer.getTokens().get(i).getValue().equalsIgnoreCase("TABLE")) {
tokens.clear();
tokens.add(lexer.getTokens().get(i));
try {
tokens.add(lexer.getTokens().get(i + 1));
}
catch (ParseFailedException e) {
throw new ParseFailedException("Parse failed!");
}
i++;
ASTNode child = new TableNode(tokens);
root.addChild(child);
currentNode = child;
}
else if (i == 1 && !lexer.getTokens().get(i).getValue().equalsIgnoreCase("TABLE")){
tokens.clear();
tokens.add(lexer.getTokens().get(i));
for (int j = i + 1; j < lexer.getTokens().size(); j++) {
if (lexer.getTokens().get(j).getValue().equalsIgnoreCase("TABLE")) {
ASTNode child = new TableTypeNode(tokens);
root.addChild(child);
currentNode = child;
tokens.clear();
tokens.add(lexer.getTokens().get(j));
try {
tokens.add(lexer.getTokens().get(j + 1));
}
catch (ParseFailedException e) {
throw new ParseFailedException("Parse failed!");
}
i = j + 1;
break;
}
tokens.add(lexer.getTokens().get(j));
}
ASTNode child = new TableNode(tokens);
currentNode.addChild(child);
currentNode = child;
}
}
return root;
}