From 0133a237ac004cca986e3f10c2bf9152e45d3a75 Mon Sep 17 00:00:00 2001 From: Guus Waals <_@guusw.nl> Date: Tue, 8 Oct 2024 00:58:50 +0800 Subject: [PATCH] Add cparser java project --- java/cparser/.gitignore | 2 + .../tests/bin => java/cparser}/pom.xml | 13 +- .../cparser/src/main/java}/cparser/Log.java | 0 .../cparser/src/main/java/cparser/Parser.java | 264 ++++++++++++++++++ .../src/main/java}/cparser/Tokenizer.java | 19 +- .../test/java/cparser_tests}/ParserTests.java | 24 +- {scripts => java/ghidra}/Decompile.java | 0 .../ghidra}/DumpCurrentFunction.java | 0 .../ghidra}/DumpCurrentFunctionN.java | 0 .../ghidra}/DumpCurrentFunctionRecursive.java | 0 {scripts => java/ghidra}/DumpTypes.java | 0 {scripts => java/ghidra}/ExportData.java | 0 {scripts => java/ghidra}/LICENSE | 0 .../ghidra}/RebuildFunctionDatabase.java | 0 .../ghidra}/SanitizeGlobalSymbols.java | 0 .../ghidra}/re3lib/DataTypeWriter.java | 0 .../ghidra}/re3lib/DecompileCache.java | 0 .../ghidra}/re3lib/FunctionDatabase.java | 0 .../ghidra}/re3lib/FunctionDumper.java | 0 .../ghidra}/re3lib/GlobalDumper.java | 0 .../ghidra}/re3lib/PCallTracer.java | 0 .../ghidra}/re3lib/RecompileConfig.java | 0 .../ghidra}/re3lib/TypeDumper.java | 0 {scripts => java/ghidra}/re3lib/Utils.java | 0 {scripts => java/ghidra}/readme.md | 0 scripts/NewScript.java | 15 - scripts/cparser/Parser.java | 202 -------------- scripts/cparser/tests/bin/.project | 23 -- .../bin/.settings/org.eclipse.m2e.core.prefs | 4 - scripts/cparser/tests/bin/ParserTests.class | Bin 6601 -> 0 bytes scripts/cparser/tests/pom.xml | 57 ---- 31 files changed, 299 insertions(+), 324 deletions(-) create mode 100644 java/cparser/.gitignore rename {scripts/cparser/tests/bin => java/cparser}/pom.xml (73%) rename {scripts => java/cparser/src/main/java}/cparser/Log.java (100%) create mode 100644 java/cparser/src/main/java/cparser/Parser.java rename {scripts => java/cparser/src/main/java}/cparser/Tokenizer.java (94%) rename {scripts/cparser/tests => java/cparser/src/test/java/cparser_tests}/ParserTests.java (88%) rename {scripts => java/ghidra}/Decompile.java (100%) rename {scripts => java/ghidra}/DumpCurrentFunction.java (100%) rename {scripts => java/ghidra}/DumpCurrentFunctionN.java (100%) rename {scripts => java/ghidra}/DumpCurrentFunctionRecursive.java (100%) rename {scripts => java/ghidra}/DumpTypes.java (100%) rename {scripts => java/ghidra}/ExportData.java (100%) rename {scripts => java/ghidra}/LICENSE (100%) rename {scripts => java/ghidra}/RebuildFunctionDatabase.java (100%) rename {scripts => java/ghidra}/SanitizeGlobalSymbols.java (100%) rename {scripts => java/ghidra}/re3lib/DataTypeWriter.java (100%) rename {scripts => java/ghidra}/re3lib/DecompileCache.java (100%) rename {scripts => java/ghidra}/re3lib/FunctionDatabase.java (100%) rename {scripts => java/ghidra}/re3lib/FunctionDumper.java (100%) rename {scripts => java/ghidra}/re3lib/GlobalDumper.java (100%) rename {scripts => java/ghidra}/re3lib/PCallTracer.java (100%) rename {scripts => java/ghidra}/re3lib/RecompileConfig.java (100%) rename {scripts => java/ghidra}/re3lib/TypeDumper.java (100%) rename {scripts => java/ghidra}/re3lib/Utils.java (100%) rename {scripts => java/ghidra}/readme.md (100%) delete mode 100644 scripts/NewScript.java delete mode 100644 scripts/cparser/Parser.java delete mode 100644 scripts/cparser/tests/bin/.project delete mode 100644 scripts/cparser/tests/bin/.settings/org.eclipse.m2e.core.prefs delete mode 100644 scripts/cparser/tests/bin/ParserTests.class delete mode 100644 scripts/cparser/tests/pom.xml diff --git a/java/cparser/.gitignore b/java/cparser/.gitignore new file mode 100644 index 00000000..1ff28072 --- /dev/null +++ b/java/cparser/.gitignore @@ -0,0 +1,2 @@ +.class +target/ \ No newline at end of file diff --git a/scripts/cparser/tests/bin/pom.xml b/java/cparser/pom.xml similarity index 73% rename from scripts/cparser/tests/bin/pom.xml rename to java/cparser/pom.xml index de0db96f..fea56ca6 100644 --- a/scripts/cparser/tests/bin/pom.xml +++ b/java/cparser/pom.xml @@ -5,8 +5,8 @@ 4.0.0 - com.yourname.scripts - cparser-tests + cparser + cparser 1.0-SNAPSHOT @@ -20,13 +20,8 @@ - - ../../cparser - . + + ./src/test/java diff --git a/scripts/cparser/Log.java b/java/cparser/src/main/java/cparser/Log.java similarity index 100% rename from scripts/cparser/Log.java rename to java/cparser/src/main/java/cparser/Log.java diff --git a/java/cparser/src/main/java/cparser/Parser.java b/java/cparser/src/main/java/cparser/Parser.java new file mode 100644 index 00000000..a871c702 --- /dev/null +++ b/java/cparser/src/main/java/cparser/Parser.java @@ -0,0 +1,264 @@ +package cparser; + +import java.util.*; + +import cparser.Tokenizer.Token; +import cparser.Log; + +public class Parser { + private Tokenizer.TokenSet tokenSet; + private List statements; + private Log log; + private Tokenizer.Token[] tokens; + + public Parser(Tokenizer.TokenSet tokenSet, Log log) { + this.tokenSet = tokenSet; + this.statements = new ArrayList<>(); + this.tokens = tokenSet.getTokens(); + } + + void log(String msg) { + if (log != null) { + log.log(msg); + } + } + + int index = 0; + + public void parse() { + for (index = 0; index < tokens.length; index++) { + Tokenizer.Token token = tokens[index]; + if (token.type == Tokenizer.TokenType.BLOCK_COMMENT || token.type == Tokenizer.TokenType.COMMENT) { + continue; + } else if (token.type == Tokenizer.TokenType.HASH) { + index = parsePreprocessorExpression(); + } else { + index = parseStmt(); + } + } + } + + private int parseStmt() { + int startIndex = index; + List idStack = new ArrayList<>(); + for (int i = startIndex; i < tokens.length; i++) { + Tokenizer.Token token = tokens[i]; + if (token.type == Tokenizer.TokenType.L_PAREN && idStack.size() > 0) { + // Function call? + } else if (token.type == Tokenizer.TokenType.SEMICOLON) { + boolean isVarAssign = false; + for (int j = startIndex; j < i; j++) { + if (tokens[j].type == Tokenizer.TokenType.EQUALS) { + isVarAssign = true; + } + } + } else if (token.type == Tokenizer.TokenType.L_BRACE) { + boolean isVarAssign = false; + for (int j = startIndex; j < i; j++) { + if (tokens[j].type == Tokenizer.TokenType.L_PAREN) { + int endIndex = findClosingParenthesis(j); + if (endIndex != -1) { + index = endIndex; + } + } + } + } + } + // if (index + 1 < tokens.length && tokens[index + 1].type == + // Tokenizer.TokenType.L_PAREN) { + // // Function call or declaration/definition + // if (index > 0 && (tokens[index - 1].type == Tokenizer.TokenType.IDENTIFIER || + // tokens[index - 1].type == Tokenizer.TokenType.OTHER)) { + // // Function declaration or definition + // index = parseFunctionDeclaration(); + // } else { + // // Function call + // index = parseFunctionCall(); + // } + // } else { + // // Variable reference + // index = parseVariableReference(); + // } + } + + private int parseVarDecl(int startIndex, int endIndex) { + if (tokens[startIndex].type == Tokenizer.TokenType.R_PAREN) { + return startIndex; + } + return startIndex + 1; + } + + private ArgumentList parseArgumentList(int startIndex, int endIndex) { + List arguments = new ArrayList<>(); + for (int i = startIndex; i < endIndex; i++) { + if (tokens[i].type == Tokenizer.TokenType.COMMA) { + + } + } + return new ArgumentList(arguments); + } + + // Try to parse prep expression + private int parsePreprocessorExpression() { + int index = this.index; + if (tokenSet.tokens[index].type == Tokenizer.TokenType.HASH) { + int startLine = tokenSet.getLine(index); + while (index < tokenSet.tokens.length) { + if (tokenSet.getLine(index) > startLine) { + break; + } + index++; + } + // Find first next line token + index--; + } + return index; + } + + // // Try to parse function declaration and return the ending token index + // private int parseFunctionDeclaration() { + // Tokenizer.Token[] tokens = tokenSet.getTokens(); + // String name = tokenSet.getTextNoNewlines(tokens[index]); + // int endIndex = findClosingParenthesis(index + 1); + + // if (endIndex == -1) + // return index; + + // boolean isDefinition = false; + // if (endIndex + 1 < tokens.length && tokens[endIndex + 1].type == + // Tokenizer.TokenType.L_BRACE) { + // isDefinition = true; + // endIndex = findClosingBrace(endIndex + 1); + // } + + // if (endIndex == -1) + // return index; + + // Function function = new Function(name, tokens[index].ofs, + // tokens[endIndex].ofs + tokens[endIndex].len, + // isDefinition); + // functions.add(function); + // return endIndex - 1; + // } + + // // Try to parse function call and return the ending token index + // private int parseFunctionCall() { + // Tokenizer.Token[] tokens = tokenSet.getTokens(); + // String name = tokenSet.getTextNoNewlines(tokens[index]); + // int endIndex = findClosingParenthesis(index + 1); + // if (endIndex == -1) + // return index; + + // FunctionCall functionCall = new FunctionCall(name, tokens[index].ofs, + // tokens[endIndex].ofs + tokens[endIndex].len); + // functionCalls.add(functionCall); + // return endIndex - 1; + // } + + // // Try to parse variable reference and add it to the list + // private int parseVariableReference() { + // Tokenizer.Token token = tokenSet.getTokens()[index]; + // String name = tokenSet.getTextNoNewlines(token); + // Variable variable = new Variable(name, token.ofs, token.ofs + token.len); + // variables.add(variable); + // return index + 1; + // } + + private int findClosingParenthesis(int startIndex) { + Tokenizer.Token[] tokens = tokenSet.getTokens(); + int parenCount = 1; + for (int i = startIndex + 1; i < tokens.length; i++) { + if (tokens[i].type == Tokenizer.TokenType.L_PAREN) { + parenCount++; + } else if (tokens[i].type == Tokenizer.TokenType.R_PAREN) { + parenCount--; + if (parenCount == 0) { + return i; + } + } + } + return -1; + } + + private int findClosingBrace(int startIndex) { + Tokenizer.Token[] tokens = tokenSet.getTokens(); + int braceCount = 1; + for (int i = startIndex + 1; i < tokens.length; i++) { + if (tokens[i].type == Tokenizer.TokenType.L_BRACE) { + braceCount++; + } else if (tokens[i].type == Tokenizer.TokenType.R_BRACE) { + braceCount--; + if (braceCount == 0) { + return i; + } + } + } + return -1; + } + + public static class Span { + public final int startOffset; + public final int endOffset; + + public Span(int startOffset, int endOffset) { + this.startOffset = startOffset; + this.endOffset = endOffset; + } + } + + public static class Type { + public final Span span; + + public Type(Span span) { + this.span = span; + } + } + + public static class Identifier { + public final Span span; + + public Identifier(Span span) { + this.span = span; + } + } + + public static class ArgumentList { + public final List arguments; + + public ArgumentList(List arguments) { + this.arguments = arguments; + } + } + + public static class VariableDeclaration { + public final Type type; + public final Identifier name; + + public VariableDeclaration(Type type, Identifier name) { + this.type = type; + this.name = name; + } + } + + public static class FunctionDecl { + public final Identifier name; + public final Type returnValue; + public final ArgumentList args; + + public FunctionDecl(Identifier name, Type returnValue, ArgumentList args) { + this.name = name; + this.returnValue = returnValue; + this.args = args; + } + } + + public static class FunctionCall { + public final Identifier name; + public final ArgumentList args; + + public FunctionCall(Identifier name, ArgumentList args) { + this.name = name; + this.args = args; + } + } +} diff --git a/scripts/cparser/Tokenizer.java b/java/cparser/src/main/java/cparser/Tokenizer.java similarity index 94% rename from scripts/cparser/Tokenizer.java rename to java/cparser/src/main/java/cparser/Tokenizer.java index b1871718..968ca858 100644 --- a/scripts/cparser/Tokenizer.java +++ b/java/cparser/src/main/java/cparser/Tokenizer.java @@ -13,7 +13,12 @@ public class Tokenizer { R_PAREN, L_BRACE, R_BRACE, + L_IDX, + R_IDX, SEMICOLON, + EQUALS, + ARROW, + STAR, COMMA, COMMENT, BLOCK_COMMENT, @@ -229,7 +234,7 @@ public class Tokenizer { } public boolean isKeyword(String text) { - return text.equals("while") || text.equals("for") || text.equals("if") || text.equals("else") || + return text.equals("while") || text.equals("for") || text.equals("if") || text.equals("else") || text.equals("return") || text.equals("struct") || text.equals("typedef") || text.equals("enum") || text.equals("union") || text.equals("const") || text.equals("static"); } @@ -325,6 +330,18 @@ public class Tokenizer { newType = TokenType.COMMA; } else if (currentChar == '#') { newType = TokenType.HASH; + } else if (currentChar == '[') { + newType = TokenType.L_IDX; + } else if (currentChar == ']') { + newType = TokenType.R_IDX; + } else if (currentChar == '=') { + newType = TokenType.EQUALS; + } else if (currentChar == '>' && index > 0 && text.charAt(index - 1) == '-') { + newType = TokenType.ARROW; + currentType = TokenType.ARROW; + tokenStart = index - 1; + } else if (currentChar == '*') { + newType = TokenType.STAR; } // Handle other characters else { diff --git a/scripts/cparser/tests/ParserTests.java b/java/cparser/src/test/java/cparser_tests/ParserTests.java similarity index 88% rename from scripts/cparser/tests/ParserTests.java rename to java/cparser/src/test/java/cparser_tests/ParserTests.java index c78de600..287db162 100644 --- a/scripts/cparser/tests/ParserTests.java +++ b/java/cparser/src/test/java/cparser_tests/ParserTests.java @@ -1,5 +1,4 @@ -package cparser.tests; - +package cparser_tests; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; @@ -12,17 +11,16 @@ import cparser.Log; import java.util.List; public class ParserTests { - private Parser parser; private Tokenizer.TokenSet tokenSet; - private Log mockLog; + private Log testLog; @Before public void setUp() { - mockLog = new Log() { + testLog = new Log() { @Override - public void log(String msg) { - // Do nothing for tests + public void log(String msg) { + System.out.println(msg); } }; } @@ -31,7 +29,7 @@ public class ParserTests { public void testParseVariableReference() { String code = "int x = 5;"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List variables = parser.getVariables(); @@ -43,7 +41,7 @@ public class ParserTests { public void testParseFunctionDeclaration() { String code = "void foo(int a, int b);"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List functions = parser.getFunctions(); @@ -56,7 +54,7 @@ public class ParserTests { public void testParseFunctionDefinition() { String code = "int bar(int x) { return x + 1; }"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List functions = parser.getFunctions(); @@ -69,7 +67,7 @@ public class ParserTests { public void testParseFunctionCall() { String code = "result = calculate(5, 10);"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List functionCalls = parser.getFunctionCalls(); @@ -81,7 +79,7 @@ public class ParserTests { public void testParsePreprocessorDirective() { String code = "#include \nint main() { return 0; }"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List functions = parser.getFunctions(); @@ -105,7 +103,7 @@ public class ParserTests { "}"; tokenSet = new Tokenizer(code).parse(); - parser = new Parser(tokenSet, mockLog); + parser = new Parser(tokenSet, testLog); parser.parse(); List variables = parser.getVariables(); diff --git a/scripts/Decompile.java b/java/ghidra/Decompile.java similarity index 100% rename from scripts/Decompile.java rename to java/ghidra/Decompile.java diff --git a/scripts/DumpCurrentFunction.java b/java/ghidra/DumpCurrentFunction.java similarity index 100% rename from scripts/DumpCurrentFunction.java rename to java/ghidra/DumpCurrentFunction.java diff --git a/scripts/DumpCurrentFunctionN.java b/java/ghidra/DumpCurrentFunctionN.java similarity index 100% rename from scripts/DumpCurrentFunctionN.java rename to java/ghidra/DumpCurrentFunctionN.java diff --git a/scripts/DumpCurrentFunctionRecursive.java b/java/ghidra/DumpCurrentFunctionRecursive.java similarity index 100% rename from scripts/DumpCurrentFunctionRecursive.java rename to java/ghidra/DumpCurrentFunctionRecursive.java diff --git a/scripts/DumpTypes.java b/java/ghidra/DumpTypes.java similarity index 100% rename from scripts/DumpTypes.java rename to java/ghidra/DumpTypes.java diff --git a/scripts/ExportData.java b/java/ghidra/ExportData.java similarity index 100% rename from scripts/ExportData.java rename to java/ghidra/ExportData.java diff --git a/scripts/LICENSE b/java/ghidra/LICENSE similarity index 100% rename from scripts/LICENSE rename to java/ghidra/LICENSE diff --git a/scripts/RebuildFunctionDatabase.java b/java/ghidra/RebuildFunctionDatabase.java similarity index 100% rename from scripts/RebuildFunctionDatabase.java rename to java/ghidra/RebuildFunctionDatabase.java diff --git a/scripts/SanitizeGlobalSymbols.java b/java/ghidra/SanitizeGlobalSymbols.java similarity index 100% rename from scripts/SanitizeGlobalSymbols.java rename to java/ghidra/SanitizeGlobalSymbols.java diff --git a/scripts/re3lib/DataTypeWriter.java b/java/ghidra/re3lib/DataTypeWriter.java similarity index 100% rename from scripts/re3lib/DataTypeWriter.java rename to java/ghidra/re3lib/DataTypeWriter.java diff --git a/scripts/re3lib/DecompileCache.java b/java/ghidra/re3lib/DecompileCache.java similarity index 100% rename from scripts/re3lib/DecompileCache.java rename to java/ghidra/re3lib/DecompileCache.java diff --git a/scripts/re3lib/FunctionDatabase.java b/java/ghidra/re3lib/FunctionDatabase.java similarity index 100% rename from scripts/re3lib/FunctionDatabase.java rename to java/ghidra/re3lib/FunctionDatabase.java diff --git a/scripts/re3lib/FunctionDumper.java b/java/ghidra/re3lib/FunctionDumper.java similarity index 100% rename from scripts/re3lib/FunctionDumper.java rename to java/ghidra/re3lib/FunctionDumper.java diff --git a/scripts/re3lib/GlobalDumper.java b/java/ghidra/re3lib/GlobalDumper.java similarity index 100% rename from scripts/re3lib/GlobalDumper.java rename to java/ghidra/re3lib/GlobalDumper.java diff --git a/scripts/re3lib/PCallTracer.java b/java/ghidra/re3lib/PCallTracer.java similarity index 100% rename from scripts/re3lib/PCallTracer.java rename to java/ghidra/re3lib/PCallTracer.java diff --git a/scripts/re3lib/RecompileConfig.java b/java/ghidra/re3lib/RecompileConfig.java similarity index 100% rename from scripts/re3lib/RecompileConfig.java rename to java/ghidra/re3lib/RecompileConfig.java diff --git a/scripts/re3lib/TypeDumper.java b/java/ghidra/re3lib/TypeDumper.java similarity index 100% rename from scripts/re3lib/TypeDumper.java rename to java/ghidra/re3lib/TypeDumper.java diff --git a/scripts/re3lib/Utils.java b/java/ghidra/re3lib/Utils.java similarity index 100% rename from scripts/re3lib/Utils.java rename to java/ghidra/re3lib/Utils.java diff --git a/scripts/readme.md b/java/ghidra/readme.md similarity index 100% rename from scripts/readme.md rename to java/ghidra/readme.md diff --git a/scripts/NewScript.java b/scripts/NewScript.java deleted file mode 100644 index 556b9968..00000000 --- a/scripts/NewScript.java +++ /dev/null @@ -1,15 +0,0 @@ -// Script to categorize Stuff -// @menupath File.Run.ScriptName -// @category _Reman3 - -import ghidra.app.script.GhidraScript; -import re3lib.*; - -public class NewScript extends GhidraScript { - - @Override - protected void run() throws Exception { - // TODO: Add your script logic here - println("Hello from NewScript!"); - } -} diff --git a/scripts/cparser/Parser.java b/scripts/cparser/Parser.java deleted file mode 100644 index 36baa2a5..00000000 --- a/scripts/cparser/Parser.java +++ /dev/null @@ -1,202 +0,0 @@ -package cparser; - -import java.util.*; - -import cparser.Tokenizer.Token; -import cparser.Log; - -public class Parser { - private Tokenizer.TokenSet tokenSet; - private List variables; - private List functions; - private List functionCalls; - private Log log; - - public Parser(Tokenizer.TokenSet tokenSet, Log log) { - this.tokenSet = tokenSet; - this.variables = new ArrayList<>(); - this.functions = new ArrayList<>(); - this.functionCalls = new ArrayList<>(); - } - - void log(String msg) { - if (log != null) { - log.log(msg); - } - } - - int index = 0; - - public void parse() { - Tokenizer.Token[] tokens = tokenSet.getTokens(); - for (index = 0; index < tokens.length; index++) { - Tokenizer.Token token = tokens[index]; - if (token.type == Tokenizer.TokenType.BLOCK_COMMENT || token.type == Tokenizer.TokenType.COMMENT) { - continue; - } else if (token.type == Tokenizer.TokenType.HASH) { - index = parsePreprocessorExpression(); - } else if (tokens[index].type == Tokenizer.TokenType.IDENTIFIER) { - if (index + 1 < tokens.length && tokens[index + 1].type == Tokenizer.TokenType.L_PAREN) { - // Function call or declaration/definition - if (index > 0 && (tokens[index - 1].type == Tokenizer.TokenType.IDENTIFIER || - tokens[index - 1].type == Tokenizer.TokenType.OTHER)) { - // Function declaration or definition - index = parseFunctionDeclaration(); - } else { - // Function call - index = parseFunctionCall(); - } - } else { - // Variable reference - index = parseVariableReference(); - } - } - } - } - - // Try to parse prep expression - private int parsePreprocessorExpression() { - int index = this.index; - if (tokenSet.tokens[index].type == Tokenizer.TokenType.HASH) { - int startLine = tokenSet.getLine(index); - while (index < tokenSet.tokens.length) { - if (tokenSet.getLine(index) > startLine) { - break; - } - index++; - } - // Find first next line token - index--; - } - return index; - } - - // Try to parse function declaration and return the ending token index - private int parseFunctionDeclaration() { - Tokenizer.Token[] tokens = tokenSet.getTokens(); - String name = tokenSet.getTextNoNewlines(tokens[index]); - int endIndex = findClosingParenthesis(index + 1); - - if (endIndex == -1) - return index; - - boolean isDefinition = false; - if (endIndex + 1 < tokens.length && tokens[endIndex + 1].type == Tokenizer.TokenType.L_BRACE) { - isDefinition = true; - endIndex = findClosingBrace(endIndex + 1); - } - - if (endIndex == -1) - return index; - - Function function = new Function(name, tokens[index].ofs, tokens[endIndex].ofs + tokens[endIndex].len, - isDefinition); - functions.add(function); - return endIndex - 1; - } - - // Try to parse function call and return the ending token index - private int parseFunctionCall() { - Tokenizer.Token[] tokens = tokenSet.getTokens(); - String name = tokenSet.getTextNoNewlines(tokens[index]); - int endIndex = findClosingParenthesis(index + 1); - if (endIndex == -1) - return index; - - FunctionCall functionCall = new FunctionCall(name, tokens[index].ofs, - tokens[endIndex].ofs + tokens[endIndex].len); - functionCalls.add(functionCall); - return endIndex - 1; - } - - // Try to parse variable reference and add it to the list - private int parseVariableReference() { - Tokenizer.Token token = tokenSet.getTokens()[index]; - String name = tokenSet.getTextNoNewlines(token); - Variable variable = new Variable(name, token.ofs, token.ofs + token.len); - variables.add(variable); - return index + 1; - } - - private int findClosingParenthesis(int startIndex) { - Tokenizer.Token[] tokens = tokenSet.getTokens(); - int parenCount = 1; - for (int i = startIndex + 1; i < tokens.length; i++) { - if (tokens[i].type == Tokenizer.TokenType.L_PAREN) { - parenCount++; - } else if (tokens[i].type == Tokenizer.TokenType.R_PAREN) { - parenCount--; - if (parenCount == 0) { - return i; - } - } - } - return -1; - } - - private int findClosingBrace(int startIndex) { - Tokenizer.Token[] tokens = tokenSet.getTokens(); - int braceCount = 1; - for (int i = startIndex + 1; i < tokens.length; i++) { - if (tokens[i].type == Tokenizer.TokenType.L_BRACE) { - braceCount++; - } else if (tokens[i].type == Tokenizer.TokenType.R_BRACE) { - braceCount--; - if (braceCount == 0) { - return i; - } - } - } - return -1; - } - - public List getVariables() { - return variables; - } - - public List getFunctions() { - return functions; - } - - public List getFunctionCalls() { - return functionCalls; - } - - public static class Variable { - public final String name; - public final int startOffset; - public final int endOffset; - - public Variable(String name, int startOffset, int endOffset) { - this.name = name; - this.startOffset = startOffset; - this.endOffset = endOffset; - } - } - - public static class Function { - public final String name; - public final int startOffset; - public final int endOffset; - public final boolean isDefinition; - - public Function(String name, int startOffset, int endOffset, boolean isDefinition) { - this.name = name; - this.startOffset = startOffset; - this.endOffset = endOffset; - this.isDefinition = isDefinition; - } - } - - public static class FunctionCall { - public final String name; - public final int startOffset; - public final int endOffset; - - public FunctionCall(String name, int startOffset, int endOffset) { - this.name = name; - this.startOffset = startOffset; - this.endOffset = endOffset; - } - } -} diff --git a/scripts/cparser/tests/bin/.project b/scripts/cparser/tests/bin/.project deleted file mode 100644 index d48d61dd..00000000 --- a/scripts/cparser/tests/bin/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - cparser-tests - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/scripts/cparser/tests/bin/.settings/org.eclipse.m2e.core.prefs b/scripts/cparser/tests/bin/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/scripts/cparser/tests/bin/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/scripts/cparser/tests/bin/ParserTests.class b/scripts/cparser/tests/bin/ParserTests.class deleted file mode 100644 index cd8d07c2dae798e53e0d00bf89faed21985502c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6601 zcmeHL-EI^&82!8?yPHiQG!6X$nwqqQgwjo0AysM+5+p^6G=YdLNR@iy%sPq5j6K+% z74&KP7L{75z2^mZn~KjfyURwn8aIMUL31=EbPz>f%?f*NPf` zMMNuA@lm7>2uw#<;FsntA%(q7;LOVEV**nfs?S?6PhkG_m_KQ)bQ?Y(^S?cknj4i2 zc%Q~9%|ybiP?Ba^?Ik=lKhn-j?~qgbJmb_6bls%8yH*Q%Kw~DQvUHEr5lNSBSt<+_ zvM)5QD|wDh`&@Gw;|Tj&rTG3d$F@H0#tAcq?u&#Q?O8he)6&%|t1fnO+2{L0x_H4Btg}3^ljttp&W&{~ zh@wn7@07$7l%1I}jXX1U#41u#l zeW6ezP%xM_+&;<(TzZ&GD^k8C2f_&KcE?@r3poILwWIQWv)+c!2)qoC4Nl{Ih`>ds z0ThlIS?}RUzd&szaz;ZFTp^8SfC=h9@5x&>DpnQOkW-lH1TK#w=3Xvir=D#V0#lJW zm{y)<)GdSqVoJZ!y1|l!z|#2pj^-%F#oQRBHw#To3^2nN$AAr#?GpaX>3nTiA&s3n zFj1`hFY?cO8JJ=6SI7}WptGxT9rJsr)S`A>_UYkHXu9q^YQYUun=yA=(8WEnY;M7~ zcnpp2e`C#>z}&Vl2G!#pdda{Qz`iJzpMeHULlbKaXhFLuXP|>+8xgZGhtIS4b`y~V z%g�?&pQ`zr(`c1@;0yn?(zOkFf6Wh=Pyd6D$dQieDOVafrHv<(q7mJ#33!wxwfi zpL^M;hi%ErwtPai>t41mPRRCym+i|FvTb_VzB(b>j+gCf0NXW>7k=@uHDDFJ*nsQs O9hPm3vajJASbGHx^DVvr diff --git a/scripts/cparser/tests/pom.xml b/scripts/cparser/tests/pom.xml deleted file mode 100644 index de0db96f..00000000 --- a/scripts/cparser/tests/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - - com.yourname.scripts - cparser-tests - 1.0-SNAPSHOT - - - - - junit - junit - 4.13.2 - test - - - - - - ../../cparser - . - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.2 - - - **/ParserTests.java - - - - - - - \ No newline at end of file