This is just a demo repo to show how a plugin can be developed and integrated with Cherow parser.
import { parseScript } from 'cherow';
import { dummy } from 'cherow-dummy-plugin';
// Parse with the new plugin enabled
parseScript('1', {
plugins: [
dummy(123); // '123' will be the value on the literal node
]
});
Start a new node with this.getLocations()
and finish it with this.finishNode()
as shown in this example:
const pos = this.getLocations();
return this.finishNode(pos, {
type: 'dummy'
});
Note! The location tracking will not be enabled unless the options are set for it - { loc: true, ranges: true }
By default Cherow pass around context masks everywhere as a simple immutable bit set.
It's also possible to extend this with your own set of context masks.
export const Context = {
None = 0,
Foo = 1 << 0,
Bar = 1 << 1,
}
export default function(value) {
return (parser) => {
parser.dummy(context | Context.Foo) {
// do something with the context mask
};
};
}
Cherow also let you use mutable parser flags, in case any flags need passed by reference. For this you can create your
own bitmasks and hook them on the this.flags
.
export const Flags = {
None = 0,
Literal = 1 << 0,
Identifier = 1 << 1,
}
export default function(value) {
return (parser) => {
// Set the mutable parser flag
parser.flags |= Flags.Identifier;
parser.dummy(context) {
// If the mutable parser flag is the 'Literal' mask, Cherow will return
// a literal AST node. Else it return a identifier AST node
if (this.flags & Flags.Literal) return this.parseLiteral(context);
return this.parseIdentifier(context);
};
};
};
-
parse(context) {}
- the main parser function -
parseLiteral(context) {}
- parses a literal node -
parseIdentifier(context) {}
- parses a identifier node
For others, please see the Cherow
source code