Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13

Overview

JavaParser

Maven Central Build Status Coverage Status Join the chat at https://gitter.im/javaparser/javaparser License LGPL-3/Apache-2.0 DOI

This project contains a set of libraries implementing a Java 1.0 - Java 14 Parser with advanced analysis functionalities. This includes preview features to Java 13, with Java 14 preview features work-in-progress.

Our main site is at JavaParser.org

Setup

The project binaries are available in Maven Central.

We strongly advise users to adopt Maven, Gradle or another build system for their projects. If you are not familiar with them we suggest taking a look at the maven quickstart projects (javaparser-maven-sample, javasymbolsolver-maven-sample).

Just add the following to your maven configuration or tailor to your own dependency management system.

Please refer to the Migration Guide when upgrading from 2.5.1 to 3.0.0+

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-symbol-solver-core</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.20.0'

Since Version 3.5.10, the JavaParser project includes the JavaSymbolSolver. While JavaParser generates an Abstract Syntax Tree, JavaSymbolSolver analyzes that AST and is able to find the relation between an element and its declaration (e.g. for a variable name it could be a parameter of a method, providing information about its type, position in the AST, ect).

Using the dependency above will add both JavaParser and JavaSymbolSolver to your project. If you only need the core functionality of parsing Java source code in order to traverse and manipulate the generated AST, you can reduce your projects boilerplate by only including JavaParser to your project:

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-core:3.20.0'

Since version 3.6.17 the AST can be serialized to JSON. There is a separate module for this:

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core-serialization</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-core-serialization:3.20.0'

How To Compile Sources

If you checked out the project from GitHub you can build the project with maven using:

mvn clean install

If you checkout the sources and want to view the project in an IDE, it is best to first generate some of the source files; otherwise you will get many compilation complaints in the IDE. (mvn clean install already does this for you.)

mvn javacc:javacc

If you modify the code of the AST nodes, specifically if you add or remove fields or node classes, the code generators will update a lot of code for you. The run_metamodel_generator.sh script will rebuild the metamodel, which is used by the code generators which are run by run_core_generators.sh Make sure that javaparser-core at least compiles before you run these.

Note: for Eclipse IDE follow the steps described in the wiki: https://github.com/javaparser/javaparser/wiki/Eclipse-Project-Setup-Guide

More information

JavaParser.org is the main information site.

License

JavaParser is available either under the terms of the LGPL License or the Apache License. You as the user are entitled to choose the terms under which adopt JavaParser.

For details about the LGPL License please refer to LICENSE.LGPL.

For details about the Apache License please refer to LICENSE.APACHE.

Comments
  • issue124: initial implementation of Lexical Preservation

    issue124: initial implementation of Lexical Preservation

    Initial work on Lexical Preservation.

    I started cleaning up my experiment and move to using tokens. My experiment had more code and several tests, I have removed them for now to start from something cleaner.

    The next steps will be to write some tests and build from there.

    In this way we can discuss and see how work proceed.

    opened by ftomassetti 66
  • License under an Apache license

    License under an Apache license

    GPL and LGPL licensed libraries is often problematic when integrating in other projects. Could it be possible to also license the project under the Apache license, or even MIT / BSD?

    Improvement 
    opened by glaforge 60
  • Issue 1154 - Bridging JP & JSS

    Issue 1154 - Bridging JP & JSS

    This thing snowballed... basically I brought declarations & types interfaces from JSS.

    We have the concept of "ResolvedDeclarations" and "ResolvedTypes". ResolvedDeclarations can be obtained by JP declarations or by class files or through reflection.

    How do we get a ResolvedDeclaration from a JP Declaration? Calling the resolve method. This resolve method will look into the data map of the node for a SymbolResolver which will do the mapping.

    Similarly we have ResolvedTypes, which have more features. They can also be obtained from JP type in the same way (calling the resolve method).

    It is larger than expected but it compiles at least and it would probably be more obvious to use. Also, it would remove some names confusion (basically JSS stuff is prefixed with "Resolved").

    What do you guys think?

    opened by ftomassetti 36
  • Support for Java 9 project Jigsaw module-info.java files

    Support for Java 9 project Jigsaw module-info.java files

    See #554.

    This is a first draft. It seems to parse and print files quite well.

    It has one big disadvantage: there is now a second grammar, and it contains a copy of the first. The differences are small, so that should be fixable with some trickery.

    CSM or symbol solver support is not there yet.

    I think the most interesting thing to look at is the unit test: https://github.com/javaparser/javaparser/pull/800/files#diff-32ad75ad8b271ad317da30653e5b9c83

    opened by matozoid 32
  • SymbolSolver is unable to .resolve()

    SymbolSolver is unable to .resolve()

    Hello,

    i am trying to find the fully qualified name of interface main.MyInterface<E> that is being implemented in class main.MyClass<E>.

    package main;
    public class MyClass<E> implements MyInterface<E> { }
    
    package main;
    
    public class MyInterface<E> { }
    
    for (ClassOrInterfaceType type : classDeclaration.getImplementedTypes()) {
    	ResolvedReferenceType rrt = type.resolve(); // exception gets thrown here
    	if (rrt != null) {
    		String interfaceName = rrt.getQualifiedName();
    		// do other stuff with it
    	}
    }
    

    Sadly, this yields me an exception:

    Symbol resolution not configured: to configure consider setting a SymbolResolver in the ParserConfiguration
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$5(Node.java:682)
    	at java.base/java.util.Optional.map(Optional.java:254)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:679)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:292)
    

    I am setting a SymbolSolver before I start running .resolve():

    CombinedTypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver());
    // optionally some more external libraries added (required for what I am doing)
    CombinedTypeSolver finalTypeSolver = new CombinedTypeSolver(typeSolver);
    if (path.endsWith(".jar")) {
    	finalTypeSolver.add(new JarTypeSolver(path));
    } else if (path.endsWith("src")){
    	finalTypeSolver.add(new JavaParserTypeSolver(path));
    }
    
    JavaSymbolSolver symbolSolver = new JavaSymbolSolver(finalTypeSolver);
    JavaParser.getStaticConfiguration().setSymbolResolver(symbolSolver);
    

    I also double checked without the generic types and it always yields the same exception. Same issue with extending from classes. Am I doing something wrong or why does this not work as intended?

    I just updated to the 3.7.1 (from 3.6.23) and now the exception is now this:

    java.lang.IllegalStateException: No data of this type found. Use containsData to check for this first.
    	at com.github.javaparser.ast.Node.getData(Node.java:457)
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$5(Node.java:699)
    	at java.base/java.util.Optional.map(Optional.java:254)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:698)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:292)
    

    Since this did work before and only started to fail recently, I double checked what I did differently. And it turns out that I previously was using a path to a source folder (JavaParserTypeSolver). Now I am trying to read a JAR file and therefore use the JarTypeSolver, but it does not seem to work with that one. Whats going on here?

    Bug report Symbol Solver 
    opened by un0btanium 30
  • Avoid returning null lists

    Avoid returning null lists

    • every list is now initialized as an empty list
    • for backward compatibility setters accept a null but convert it to an empty lists
    • a few bugs are found: the current code was checking for a list to be null but it did not consider the possibility it was empty

    We have discussed about it on Gitter, I hope I did not forget any of the advices I received if I did please forgive me and remember me and I will update the pull requests.

    opened by ftomassetti 30
  • Methods accessible by a PackageDeclaration instance

    Methods accessible by a PackageDeclaration instance

    Hello JP, smiles So I'm working on this really interesting library which requires that this method: 'setJavadoc(Javadoc javadoc)' becomes accessible by a PackageDeclaration instance. My project is currently on hold due to the absence of this feature, so I'm actually suggesting an inclusion of this feature in your library. Patiently hoping this suggestion is considered and the library updated. Thanks JP.

    Improvement Comment support 
    opened by divad1998 29
  • How can I access the contents of my code?

    How can I access the contents of my code?

    Hi, I am new to Java Parser and I'm trying to understand how to use some of its features - if what I am thinking can be achieved.

    I have this piece of code, mainly for experimenting with Java Parser:

                     int x = 4;
    		if (x>3) {
    			for (int i=0; i<4; i++)
    				//TO-DO
    		}
    		else {
    			if (x>1) {
    				//TO-DO
    			}
    			else {
    				//TO-DO
    			}
    		}
    

    What I would like to achieve is to call JP, and based on the order of the constructs to perform some operations. So far I have tried to do this for the if statements with the public void visit(IfStmt n, Void arg) method, but this method just identifies all the ifs located in my code, without preserving the order (the second if is inside the first and not below).

    Is there a way to identify all constructs in my code and preserve their order? (I am not looking to print the AST).

    Question (JP usage) 
    opened by is742 26
  • Comments within methods not getting parsed

    Comments within methods not getting parsed

    The java class that we want to parse looks like this.

    public class StepImplementation {
        @Step("A step")
        public void contextStep() {
            // Foo bar
        }
    }
    

    When we parse this class using JavaParser.parse, the comments are ignored. CompilationUnit.toString() prints the following output. Notice that the comments within the method contextStep() is not there.

    public class StepImplementation {
        @Step("A step")
        public void contextStep() {
        }
    }
    
    Bug report Comment support 
    opened by mahendrakariya 26
  • Use threads to visit directories and parse files in parallel in SourceRoot

    Use threads to visit directories and parse files in parallel in SourceRoot

    We're getting:

    [info] Parsed 26810 files [info] ELAPSED: 70 (383 files/second)

    We wrote a regex-based tool that isn't as powerful as a Java compiler front-end, but still does a lot of work, and with that we're getting:

    26707 all Java files 32581 total files [info] ELAPSED: 19 (1714 files/second)

    It's likely that much of the difference in speed is due to the 1000 threads and 500 open files allowed in the faster one.

    Improvement Easy 
    opened by jimshowalter 24
  • ImportDeclaration to have getImportAsString method to get full import

    ImportDeclaration to have getImportAsString method to get full import

    ImportDeclaration class to have a getImportAsString method which will return fully qualified name of import irrespective of implementation of ImportDeclaration.

    public abstract String getImportAsString(){ }

    E.g. For code import java.util.List; output: java.util.List For code import static java.lang.System.out; output: java.lang.System.out For code import java.util.*; output: java.util.* For code import static java.lang.System.*; output: java.lang.System.*

    Improvement 
    opened by nishant-labs 24
  • chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.6.0

    chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10.6.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | com.puppycrawl.tools:checkstyle (source) | 10.5.0 -> 10.6.0 | age | adoption | passing | confidence |


    Release Notes

    checkstyle/checkstyle

    v10.6.0

    Checkstyle 10.6.0 - https://checkstyle.org/releasenotes.html#Release_10.6.0

    Breaking backward compatibility:

    #​12520 - Simplify JavadocStyleCheck: remove functionality for missing package-info Javadoc

    Bug fixes:

    #​12409 - Inconsistent allowedAbbreviations when a method contains an underscore #​12486 - NoWhitespaceAfter false positive on synchronized method #​11807 - Null pointer exception with records in RequireThisCheck

    Other Changes:
    Resolve pitest for profile metrics
    Review usages of `BeforeAll` in tests
    Create CI task to lint github actions
    Run regression testing in CI over openjdk19
    Replace backward slash with forward slash while creating `CheckerFrameworkError` object in `checker-framework.groovy`
    Convert sevntu-checkstyle-check to ant run
    doc: remove 'pre' tags from description
    Create YAML linting CI task
    Use Shellcheck to resolve violations code in Shell Script
    All scripts that print example of execution should not have hardcoded name in message
    'R: Push Release Notes' makes xml section version as snapshot
    'R: Push Release Notes' failing on push
    Remove 'releasenotes.xml after commit:'
    'R: Push Release Notes' failing
    Create CI task to enforce '.ci' directory contains only script files

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
  • SymbolSolver is unable to .resolve()

    SymbolSolver is unable to .resolve()

    Hi I want to find the number of immediate subclasses subordinated to a class hierarchy. Basically, I want to find the NOC metric.

    For this I have created a visitor as below;

    public class NOCVisitor extends VisitorAdapter<Void> {
    	private ResolvedTypeDeclaration resolvedType;
        private List<TypeDeclaration<?>> immediateSubclasses;
        
    	 // Override the visit method for ClassOrInterfaceDeclaration nodes
        @Override
        public void visit(ClassOrInterfaceDeclaration cid, Void arg) {
        	// Get the superclass of the class
        	
            NodeList<ClassOrInterfaceType> extendedTypes = cid.getExtendedTypes();
            if (extendedTypes.isEmpty()) {
                return;
            }
            ResolvedType extendedType = extendedTypes.get(0).resolve();//?????
            if (extendedType.isTypeVariable()) {
                return;
            }
            ClassOrInterfaceType superclassType = extendedTypes.get(0);
    
            // Find all the classes that extend the superclass
            CompilationUnit cu = (CompilationUnit) cid.getParentNode().get();
            List<ClassOrInterfaceDeclaration> subclassDeclarations = cu.findAll(ClassOrInterfaceDeclaration.class, c -> c.getExtendedTypes().stream().anyMatch(t -> t.equals(superclassType)));
    
            // Print the name of the superclass and the number of classes that extend it
            System.out.println("Superclass " + extendedType.asReferenceType().getQualifiedName() + " has " + subclassDeclarations.size() + " immediate subclasses");
    
            super.visit(cid, arg);
        }
    

    to call the visitor I have used CompilationUnit and I have parsed it. then ı have called the visitor. as below;

    File dir = new File(path);
    			JavaParser javaParser = new JavaParser();
    
    			// Iterate over all the files in the directory
    			for (File file : dir.listFiles()) {
    				collector= new ClassStatCollector();
    				// Skip files that are not Java source code files
    				if (!file.getName().endsWith(".java")) {
    					continue;
    				}
    				className=file.getName().substring(0, file.getName().indexOf("."));
    
    				cu = javaParser.parse(file).getResult().orElse(null);
    
    				
    				//find the num of immediate children -- NOC
    				
    				NOCVisitor nocVisitor = new NOCVisitor();
    				cu.accept(nocVisitor, null);
    				
    			}
    

    I am actually using a collector to keep the values but this was only to check if it works. I have done the same thing with wmc and dit metrics. they are working perfectly. However I am getting an error when ı use the solver. like below

    Exception in thread "main" java.lang.IllegalStateException: Symbol resolution not configured: to configure consider setting a SymbolResolver in the ParserConfiguration
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$7(Node.java:790)
    	at java.base/java.util.Optional.map(Optional.java:260)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:786)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:326)
    	at com.project.visitors.NOCVisitor.visit(NOCVisitor.java:30)
    	at com.project.visitors.NOCVisitor.visit(NOCVisitor.java:1)
    	at com.github.javaparser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:98)
    	at com.github.javaparser.ast.visitor.VoidVisitorAdapter.lambda$visit$43(VoidVisitorAdapter.java:175)
    	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    	at com.github.javaparser.ast.NodeList.forEach(NodeList.java:288)
    	at com.github.javaparser.ast.visitor.VoidVisitorAdapter.visit(VoidVisitorAdapter.java:175)
    	at com.project.visitors.VisitorAdapter.visit(VisitorAdapter.java:25)
    	at com.github.javaparser.ast.CompilationUnit.accept(CompilationUnit.java:133)
    	at com.project.sysClasses.MainSys.analyzeProjectStats(MainSys.java:71)
    	at com.project.GUI.Main.main(Main.java:35)
    

    So I will use this resolve a lot as I understand because I have a bunch of metrics to calculate. And I have skipped it since it has an error but the same problem occurred when I try to find NOC and RFC metrics. I will find this metrics for a project so there will be more than one java class. What ı am missing here, I am literally get blind while I am searching.

    Question (JP usage) 
    opened by burcualper 4
  • Two qustion about using type & declaration. Resolve jars which wasn't imported .

    Two qustion about using type & declaration. Resolve jars which wasn't imported .

    I have two question below:

    1. Why I can judge type isNested in declaration but cannot judge it in ClassOrInterfaceType?
    2. If I try to resolve some of java file , but their dependency jar is not registered in symbolresolver . How to resolve it without using jar? In details, can jp build a phantom class to resolve when no jar were import and use jar in self customized level when jars were import . maybe it is a complex requirement.

    Thanks.

    Question (JP usage) 
    opened by Yelixing 6
  • Why are fields (constants) disallowed in Annotation body declaration?

    Why are fields (constants) disallowed in Annotation body declaration?

    In Java, it is valid to have constant declarations inside annotation body:

    //this is valid according to the Java grammar and IntelliJ also doesn't complain
    public @interface TestAnnotation {
        public static final int CONSTANT = 0;
    
    }
    

    However, JavaParser forbids this - added in this commit, with this PR, for Issue https://github.com/javaparser/javaparser/issues/676.

    I'm curious what is the reason behind this? I know it's a long shot, but maybe @ftomassetti you remember what was the reason for Issue 676?

    opened by amihaiemil 4
  • JavaParser doesn't seem to be able to find dot-chained method calls

    JavaParser doesn't seem to be able to find dot-chained method calls

    Taking the following code and input with javaparser 3.24.7, I get the output f().g(), but I would expect the output:

    f().g()
    f()
    

    Code:

    package parser;
    
    import java.lang.System;
    
    import com.github.javaparser.JavaParser;
    import com.github.javaparser.Providers;
    import com.github.javaparser.Provider;
    import com.github.javaparser.ParseStart;
    import com.github.javaparser.ast.body.MethodDeclaration;
    import com.github.javaparser.ast.expr.MethodCallExpr;
    import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
    
    public class Parser {
        
        public static void main(String[] args)
        {
            JavaParser parser = new JavaParser();
            Provider provider = Providers.provider(System.in, parser.getParserConfiguration().getCharacterEncoding());
            ParseStart<MethodDeclaration> start = ParseStart.METHOD_DECLARATION;        
            
            MethodDeclaration root = parser.parse(start, provider).getResult().get();
    
            ExpressionExtractor expressionExtractor = new ExpressionExtractor();
            root.accept(expressionExtractor, null);
        }
    
        static class ExpressionExtractor extends VoidVisitorAdapter<Void>
        {
            public void visit(MethodCallExpr node, Void none)
            {
                System.out.println(node.toString());
            }
        }
    
    }
    

    Input:

    void function ()
    {
        f().g();
    }
    

    It seems like the parser just doesn't visit the "inner" call to f(), only its ancestor in the AST.

    Question (AST) 
    opened by geajack 1
Releases(v_snapshot_e2590f3)
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, folds, optics and typeclasses.

Derive4J: Java 8 annotation processor for deriving algebraic data types constructors, pattern matching and more! tl;dr Show me how to write, say, the

null 543 Nov 23, 2022
Elegant parsing in Java and Scala - lightweight, easy-to-use, powerful.

Please see https://repo1.maven.org/maven2/org/parboiled/ for download access to the artifacts https://github.com/sirthias/parboiled/wiki for all docum

Mathias 1.2k Dec 21, 2022
Chamomile is a Java Virtual Machine class file assembler and disassembler.

Chamomile is a Java Virtual Machine class file assembler and disassembler. Installation Maven <repositories> <repository> <id>jitpack.io</

null 15 May 24, 2022
Testing tools for javac and annotation processors

Compile Testing A library for testing javac compilation with or without annotation processors. See the javadoc for usage examples. License Copyright 2

Google 639 Dec 14, 2022
An addon that is trying to recreate Tinker's Construct within Slimefun. Adds new customisable tools with leveling and modifiers.

SlimeTinker is a Slimefun4 addon that tries it's best to recreate the amazing Tinker's Construct Mod (link) in Vanilla Minecraft. Features include: Th

null 22 Nov 6, 2022
A Java API for generating .java source files.

JavaPoet JavaPoet is a Java API for generating .java source files. Source file generation can be useful when doing things such as annotation processin

Square 10k Jan 5, 2023
Numerical-methods-using-java - Source Code for 'Numerical Methods Using Java' by Haksun Li

Apress Source Code This repository accompanies Numerical Methods Using Java by Haksun Li (Apress, 2022). Download the files as a zip using the green b

Apress 5 Nov 20, 2022
A collection of source code generators for Java.

Auto A collection of source code generators for Java. Auto‽ Java is full of code that is mechanical, repetitive, typically untested and sometimes the

Google 10k Jan 9, 2023
Catch common Java mistakes as compile-time errors

Error Prone Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time. public class ShortSet { public

Google 6.3k Dec 31, 2022
Write parsers for arbitrary text inputs, entirely in Java, with no preprocessing phase

Read me first The license of this project is Apache 2.0. Requires Java 7 or later. The latest versions are: development: 2.1.0-beta.3; requires Java 8

Francis Galiegue 62 Oct 13, 2022
Build parsers in Java

jparsec Builds mini parsers in pure Java. Latest version: 3.0 (requires Java 8+) News 2016-12-05 Removed references to Codehaus in copyright and packa

null 324 Dec 31, 2022
Compiler of Java bytecode to JavaScript

TeaVM See documentation at the project web site. Useful links: Getting started Gallery Flavour source code repository Site source code repository Disc

Alexey Andreev 2.1k Jan 3, 2023
Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13

JavaParser This project contains a set of libraries implementing a Java 1.0 - Java 14 Parser with advanced analysis functionalities. This includes pre

JavaParser 4.5k Jan 9, 2023
Immutable in-memory R-tree and R*-tree implementations in Java with reactive api

rtree In-memory immutable 2D R-tree implementation in java using RxJava Observables for reactive processing of search results. Status: released to Mav

Dave Moten 999 Dec 20, 2022
Tree View; Mind map; Think map; tree map; custom view; 自定义; 树状图;思维导图;组织机构图;层次图

GysoTreeView 【中文】【English】 ⭐ If ok, give me a star ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ Tree View; Mind map; Think map; tree map; 树状图;思维导图;组织机构图;层次图;树型图 A custom tree view for

怪兽N 303 Dec 30, 2022
Parser of the table of contents file of the 1C platform syntax helper

Парсер файла оглавления синтакс-помощника платформы 1С Что делает? Парсит вот это: Оглавление представляет собой файл без расширения, лежит в файле sh

null 9 Jan 27, 2022
An Appointment app preview.

BOOKME APP This Application is an Example of Appointment System in which you can book your appointment at Hospitals,Hotels,Saloons,Cinemas,etc. This A

null 5 Nov 29, 2022
This repository holds the famous Data Structures (mostly abstract ones) and Algorithms for sorting, traversing, and modifying them.

Data-Structures-and-Algorithms About Repo The repo contains the algorithms for manipulating the abstract data structures like Linked List, Stacks, Que

Zaid Ahmed 14 Dec 26, 2021
esProc SPL is a scripting language for data processing, with well-designed rich library functions and powerful syntax, which can be executed in a Java program through JDBC interface and computing independently.

esProc esProc is the unique name for esProc SPL package. esProc SPL is an open-source programming language for data processing, which can perform comp

null 990 Dec 27, 2022