forked from opengaussexamples/examples
revise
This commit is contained in:
parent
33978043c6
commit
18ded7e870
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
package Exception;
|
||||
|
||||
public class ParseFailedException extends RuntimeException{
|
||||
public ParseFailedException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue