add function

This commit is contained in:
XudongXie 2024-08-24 12:01:19 +08:00
parent fe03e497a9
commit 1d40557152
5 changed files with 42 additions and 12 deletions

View File

@ -6,6 +6,8 @@
<component name="ChangeListManager">
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add function">
<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/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/OracleParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@ -43,7 +45,6 @@
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;F:/oracle2opengauss/examples/sqlTranslate&quot;,
&quot;project.structure.last.edited&quot;: &quot;模块&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;,
@ -196,7 +197,14 @@
<option name="project" value="LOCAL" />
<updated>1724423798948</updated>
</task>
<option name="localTasksCounter" value="14" />
<task id="LOCAL-00014" summary="add function">
<created>1724425628008</created>
<option name="number" value="00014" />
<option name="presentableId" value="LOCAL-00014" />
<option name="project" value="LOCAL" />
<updated>1724425628008</updated>
</task>
<option name="localTasksCounter" value="15" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">

View File

@ -43,6 +43,10 @@ public abstract class ASTNode {
return children;
}
public boolean hasChild() {
return !children.isEmpty();
}
public ASTNode getChildByName(String childName) {
for (ASTNode child : children) {
if (child.toString().equals(childName)) {

View File

@ -23,7 +23,10 @@ public class ColumnNode extends ASTNode {
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(toString() + " ");
if (node.hasChild() && !(node.getChildren().get(0) instanceof CRTEndNode) )
queryString.append(toString() + ", ");
else if (node.hasChild() && (node.getChildren().get(0) instanceof CRTEndNode))
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -17,7 +17,10 @@ public class TableConstraintNode extends ASTNode{
public void visit(ASTNode node, StringBuilder queryString)
{
queryString.append(toString() + " ");
if (node.hasChild() && !(node.getChildren().get(0) instanceof CRTEndNode) )
queryString.append(toString() + ", ");
else if (node.hasChild() && (node.getChildren().get(0) instanceof CRTEndNode))
queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);

View File

@ -4,10 +4,8 @@ import Lexer.OracleLexer;
import Lexer.Token;
import Parser.AST.ASTNode;
import Exception.ParseFailedException;
import Parser.AST.CreateTable.ColumnNode;
import Parser.AST.CreateTable.CreateTabNode;
import Parser.AST.CreateTable.TableNode;
import Parser.AST.CreateTable.TableTypeNode;
import Parser.AST.CreateTable.*;
import java.util.Stack;
import java.util.ArrayList;
@ -50,6 +48,7 @@ public class OracleParser {
throw new ParseFailedException("Parse failed!");
}
i++;
i++; // pass the "("
ASTNode child = new TableNode(tokens);
root.addChild(child);
currentNode = child;
@ -70,7 +69,7 @@ public class OracleParser {
catch (ParseFailedException e) {
throw new ParseFailedException("Parse failed!");
}
i = j + 1;
i = j + 2; // pass the "("
break;
}
tokens.add(lexer.getTokens().get(j));
@ -94,11 +93,11 @@ public class OracleParser {
else {
constraint.add(lexer.getTokens().get(j));
}
tokens.add(lexer.getTokens().get(j));
// Check () or REFERENCES other_table(other_column)
if (lexer.getTokens().get(j).hasType(Token.TokenType.KEYWORD) &&
(lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES")
|| lexer.getTokens().get(j).getValue().equalsIgnoreCase("CHECK"))) {
tokens.add(lexer.getTokens().get(j));
Stack<String> stack = new Stack<>();
for (int k = j + 1; k < lexer.getTokens().size(); k++) {
tokens.add(lexer.getTokens().get(k));
@ -129,6 +128,7 @@ public class OracleParser {
i = j;
break;
}
tokens.add(lexer.getTokens().get(j));
}
child.setTokens(tokens);
child.setConstraint(constraint);
@ -141,7 +141,6 @@ public class OracleParser {
tokens = new ArrayList<>();
tokens.add(lexer.getTokens().get(i));
for (int j = i + 1; j < lexer.getTokens().size(); j++) {
tokens.add(lexer.getTokens().get(j));
/**
* CONSTRAINT pk_example PRIMARY KEY (column1, column2)
* CONSTRAINT uk_example UNIQUE (column1)
@ -154,6 +153,7 @@ public class OracleParser {
|| lexer.getTokens().get(j).getValue().equalsIgnoreCase("PRIMARY KEY")
|| lexer.getTokens().get(j).getValue().equalsIgnoreCase("FOREIGN KEY")
|| lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES"))) {
tokens.add(lexer.getTokens().get(j));
Stack<String> stack = new Stack<>();
for (int k = j + 1; k < lexer.getTokens().size(); k++) {
tokens.add(lexer.getTokens().get(k));
@ -183,11 +183,23 @@ public class OracleParser {
i = j;
break;
}
tokens.add(lexer.getTokens().get(j));
}
}
else if (lexer.getTokens().get(i).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(i).getValue().equals(";")) {
tokens = new ArrayList<>();
tokens.add(lexer.getTokens().get(i));
ASTNode EndNode = new CRTEndNode(tokens);
currentNode.addChild(EndNode);
currentNode = EndNode;
}
else if (lexer.getTokens().get(i).hasType(Token.TokenType.EOF)) {
break;
}
else {
// throw new ParseFailedException("Parse failed!");
// System.out.println("Fail to parse:" + lexer.getTokens().get(i).getValue());
throw new ParseFailedException("Parse failed!");
}
}
return root;