79 lines
2.1 KiB
Markdown
79 lines
2.1 KiB
Markdown
[![npm](https://img.shields.io/npm/v/java-parser.svg)](https://www.npmjs.com/package/java-parser)
|
|
|
|
# java-parser
|
|
|
|
A Java Parser implemented in JavaScript using the [Chevrotain Parsing ToolKit](https://github.com/Chevrotain/chevrotain).
|
|
It outputs a **C**oncrete **S**yntax **T**ree, rather than an **A**bstract **S**yntax **T**ree.
|
|
|
|
- [On the Difference between a CST and an AST](https://stackoverflow.com/questions/1888854/what-is-the-difference-between-an-abstract-syntax-tree-and-a-concrete-syntax-tre)
|
|
|
|
Currently the main focus of this project is to be used in implementing a prettier Java plugin.
|
|
But it could also be used as the basis for other Java related tools in the JavaScript ecosystem.
|
|
|
|
## Installation
|
|
|
|
```sh
|
|
npm install java-parser --save-dev
|
|
```
|
|
|
|
or
|
|
|
|
```sh
|
|
yarn add java-parser --dev
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Parsing
|
|
|
|
```javascript
|
|
const { parse } = require("java-parser");
|
|
const javaText = `
|
|
public class HelloWorldExample{
|
|
public static void main(String args[]){
|
|
System.out.println("Hello World !");
|
|
}
|
|
}
|
|
`;
|
|
|
|
const cst = parse(javaText);
|
|
// explore the CST
|
|
```
|
|
|
|
### Traversing the CST
|
|
|
|
See relevant [Chevrotain documentation on CST Traversal](http://chevrotain.io/docs/guide/concrete_syntax_tree.html#traversing).
|
|
|
|
```javascript
|
|
const {
|
|
BaseJavaCstVisitor,
|
|
BaseJavaCstVisitorWithDefaults
|
|
} = require("java-parser");
|
|
|
|
// Use "BaseJavaCstVisitor" if you need to implement all the visitor methods yourself.
|
|
class LambdaArrowsPositionCollector extends BaseJavaCstVisitorWithDefaults {
|
|
constructor() {
|
|
super();
|
|
this.customResult = [];
|
|
this.validateVisitor();
|
|
}
|
|
|
|
lambdaExpression(ctx) {
|
|
// Collects all the starting offsets of lambda arrows in lambdas with short (no parenthesis)
|
|
// single argument lists: e.g:
|
|
// - n -> n*n (will be collected)
|
|
// - (n) -> n*n (not collected)
|
|
if (ctx.lambdaParameters[0].children.Identifier) {
|
|
this.customResult.push(ctx.Arrow[0].startOffset);
|
|
}
|
|
}
|
|
}
|
|
|
|
const lambdaArrowsCollector = new LambdaArrowsPositionCollector();
|
|
// The CST result from the previous code snippet
|
|
lambdaArrowsCollector.visit(cst);
|
|
lambdaArrowsCollector.customResult.forEach(arrowOffset => {
|
|
console.log(arrowOffset);
|
|
});
|
|
```
|