luna-parse is a parser generator.
You can generate code by writing spec files.
luna-parse is influenced by the concept of PEG (Parsing Expression Grammar).
However, it differs from PEG in that it does not perform backtracking.
The parsers generated by luna-parse are designed to be manually modifiable as needed.
This is because it is difficult for a parser generator to fully generate real-world parsers.
I am currently developing it!
An example of spec file:
parser ExampleParser {
root = topLevel+ ;
topLevel = declareVar / show ;
declareVar = VAR IDENT EQUAL expr SEMI ;
show = SHOW expr SEMI ;
term = NUMBER / IDENT ;
expr = expression {
atom term ;
operator group {
infix operator ASTA ;
infix operator SLASH ;
}
operator group {
infix operator PLUS ;
infix operator MINUS ;
}
};
}
lexer ExampleLexer {
ignored token SPACING = SPACE / LF ;
SPACE = " " ;
LF = "\r\n" / "\n" ;
token ASTA = "*" ;
token SLASH = "/" ;
token PLUS = "+" ;
token MINUS = "-" ;
token EQUAL = "=" ;
token SEMI = ";" ;
token SHOW = "show" ;
token VAR = "var" ;
token NUMBER = [1-9] [0-9]* => { token.value = text(); };
token IDENT = [a-zA-Z] [a-zA-Z0-9_]* => { token.value = text(); };
}
Parser input:
var n1 = 2;
var n2 = 3;
show n1 * n2 + 1;
- Install
git clone https://github.com/marihachi/luna-parse.git
cd luna-parse
npm i
npm run build
-
Write a spec file of your parser
-
Generate a code of your parser
npm run generate
- Enjoy your parser life!
luna-parse uses languages derived from BNF to describe grammars.
With traditional parser generators are generally not designed to make it easy to manually modify the generated parsers. Consequently, hand-writing parsers without using a parser generator was often easier to maintain.
However, since luna-parse generates recursive descent parsers, they can be easily modified later.
luna-parse also provides an expression parser that can efficiently parse expressions. An expression parser based on Operator-precedence parser (Precedence Climbing method) is generated.
MIT