import { Tree, NodePropSource, ParseWrapper, Parser, NodeSet, Input, TreeFragment, PartialParse, NodeType } from '@lezer/common'; | |
/** | |
A parse stack. These are used internally by the parser to track | |
parsing progress. They also provide some properties and methods | |
that external code such as a tokenizer can use to get information | |
about the parse state. | |
*/ | |
declare class Stack { | |
/** | |
The input position up to which this stack has parsed. | |
*/ | |
pos: number; | |
/** | |
The stack's current [context](#lr.ContextTracker) value, if | |
any. Its type will depend on the context tracker's type | |
parameter, or it will be `null` if there is no context | |
tracker. | |
*/ | |
get context(): any; | |
/** | |
Check if the given term would be able to be shifted (optionally | |
after some reductions) on this stack. This can be useful for | |
external tokenizers that want to make sure they only provide a | |
given token when it applies. | |
*/ | |
canShift(term: number): boolean; | |
/** | |
Get the parser used by this stack. | |
*/ | |
get parser(): LRParser; | |
/** | |
Test whether a given dialect (by numeric ID, as exported from | |
the terms file) is enabled. | |
*/ | |
dialectEnabled(dialectID: number): boolean; | |
private shiftContext; | |
private reduceContext; | |
private updateContext; | |
} | |
/** | |
[Tokenizers](#lr.ExternalTokenizer) interact with the input | |
through this interface. It presents the input as a stream of | |
characters, tracking lookahead and hiding the complexity of | |
[ranges](#common.Parser.parse^ranges) from tokenizer code. | |
*/ | |
declare class InputStream { | |
/** | |
Backup chunk | |
*/ | |
private chunk2; | |
private chunk2Pos; | |
/** | |
The character code of the next code unit in the input, or -1 | |
when the stream is at the end of the input. | |
*/ | |
next: number; | |
/** | |
The current position of the stream. Note that, due to parses | |
being able to cover non-contiguous | |
[ranges](#common.Parser.startParse), advancing the stream does | |
not always mean its position moves a single unit. | |
*/ | |
pos: number; | |
private rangeIndex; | |
private range; | |
/** | |
Look at a code unit near the stream position. `.peek(0)` equals | |
`.next`, `.peek(-1)` gives you the previous character, and so | |
on. | |
Note that looking around during tokenizing creates dependencies | |
on potentially far-away content, which may reduce the | |
effectiveness incremental parsing—when looking forward—or even | |
cause invalid reparses when looking backward more than 25 code | |
units, since the library does not track lookbehind. | |
*/ | |
peek(offset: number): number; | |
/** | |
Accept a token. By default, the end of the token is set to the | |
current stream position, but you can pass an offset (relative to | |
the stream position) to change that. | |
*/ | |
acceptToken(token: number, endOffset?: number): void; | |
/** | |
Accept a token ending at a specific given position. | |
*/ | |
acceptTokenTo(token: number, endPos: number): void; | |
private getChunk; | |
private readNext; | |
/** | |
Move the stream forward N (defaults to 1) code units. Returns | |
the new value of [`next`](#lr.InputStream.next). | |
*/ | |
advance(n?: number): number; | |
private setDone; | |
} | |
interface Tokenizer { | |
} | |
/** | |
@hide | |
*/ | |
declare class LocalTokenGroup implements Tokenizer { | |
readonly precTable: number; | |
readonly elseToken?: number | undefined; | |
contextual: boolean; | |
fallback: boolean; | |
extend: boolean; | |
readonly data: Readonly<Uint16Array>; | |
constructor(data: Readonly<Uint16Array> | string, precTable: number, elseToken?: number | undefined); | |
token(input: InputStream, stack: Stack): void; | |
} | |
interface ExternalOptions { | |
/** | |
When set to true, mark this tokenizer as depending on the | |
current parse stack, which prevents its result from being cached | |
between parser actions at the same positions. | |
*/ | |
contextual?: boolean; | |
/** | |
By defaults, when a tokenizer returns a token, that prevents | |
tokenizers with lower precedence from even running. When | |
`fallback` is true, the tokenizer is allowed to run when a | |
previous tokenizer returned a token that didn't match any of the | |
current state's actions. | |
*/ | |
fallback?: boolean; | |
/** | |
When set to true, tokenizing will not stop after this tokenizer | |
has produced a token. (But it will still fail to reach this one | |
if a higher-precedence tokenizer produced a token.) | |
*/ | |
extend?: boolean; | |
} | |
/** | |
`@external tokens` declarations in the grammar should resolve to | |
an instance of this class. | |
*/ | |
declare class ExternalTokenizer { | |
/** | |
Create a tokenizer. The first argument is the function that, | |
given an input stream, scans for the types of tokens it | |
recognizes at the stream's position, and calls | |
[`acceptToken`](#lr.InputStream.acceptToken) when it finds | |
one. | |
*/ | |
constructor( | |
/** | |
@internal | |
*/ | |
token: (input: InputStream, stack: Stack) => void, options?: ExternalOptions); | |
} | |
/** | |
Context trackers are used to track stateful context (such as | |
indentation in the Python grammar, or parent elements in the XML | |
grammar) needed by external tokenizers. You declare them in a | |
grammar file as `@context exportName from "module"`. | |
Context values should be immutable, and can be updated (replaced) | |
on shift or reduce actions. | |
The export used in a `@context` declaration should be of this | |
type. | |
*/ | |
declare class ContextTracker<T> { | |
/** | |
Define a context tracker. | |
*/ | |
constructor(spec: { | |
/** | |
The initial value of the context at the start of the parse. | |
*/ | |
start: T; | |
/** | |
Update the context when the parser executes a | |
[shift](https://en.wikipedia.org/wiki/LR_parser#Shift_and_reduce_actions) | |
action. | |
*/ | |
shift?(context: T, term: number, stack: Stack, input: InputStream): T; | |
/** | |
Update the context when the parser executes a reduce action. | |
*/ | |
reduce?(context: T, term: number, stack: Stack, input: InputStream): T; | |
/** | |
Update the context when the parser reuses a node from a tree | |
fragment. | |
*/ | |
reuse?(context: T, node: Tree, stack: Stack, input: InputStream): T; | |
/** | |
Reduce a context value to a number (for cheap storage and | |
comparison). Only needed for strict contexts. | |
*/ | |
hash?(context: T): number; | |
/** | |
By default, nodes can only be reused during incremental | |
parsing if they were created in the same context as the one in | |
which they are reused. Set this to false to disable that | |
check (and the overhead of storing the hashes). | |
*/ | |
strict?: boolean; | |
}); | |
} | |
/** | |
Configuration options when | |
[reconfiguring](#lr.LRParser.configure) a parser. | |
*/ | |
interface ParserConfig { | |
/** | |
Node prop values to add to the parser's node set. | |
*/ | |
props?: readonly NodePropSource[]; | |
/** | |
The name of the `@top` declaration to parse from. If not | |
specified, the first top rule declaration in the grammar is | |
used. | |
*/ | |
top?: string; | |
/** | |
A space-separated string of dialects to enable. | |
*/ | |
dialect?: string; | |
/** | |
Replace the given external tokenizers with new ones. | |
*/ | |
tokenizers?: { | |
from: ExternalTokenizer; | |
to: ExternalTokenizer; | |
}[]; | |
/** | |
Replace external specializers with new ones. | |
*/ | |
specializers?: { | |
from: (value: string, stack: Stack) => number; | |
to: (value: string, stack: Stack) => number; | |
}[]; | |
/** | |
Replace the context tracker with a new one. | |
*/ | |
contextTracker?: ContextTracker<any>; | |
/** | |
When true, the parser will raise an exception, rather than run | |
its error-recovery strategies, when the input doesn't match the | |
grammar. | |
*/ | |
strict?: boolean; | |
/** | |
Add a wrapper, which can extend parses created by this parser | |
with additional logic (usually used to add | |
[mixed-language](#common.parseMixed) parsing). | |
*/ | |
wrap?: ParseWrapper; | |
/** | |
The maximum length of the TreeBuffers generated in the output | |
tree. Defaults to 1024. | |
*/ | |
bufferLength?: number; | |
} | |
/** | |
Holds the parse tables for a given grammar, as generated by | |
`lezer-generator`, and provides [methods](#common.Parser) to parse | |
content with. | |
*/ | |
declare class LRParser extends Parser { | |
/** | |
The nodes used in the trees emitted by this parser. | |
*/ | |
readonly nodeSet: NodeSet; | |
createParse(input: Input, fragments: readonly TreeFragment[], ranges: readonly { | |
from: number; | |
to: number; | |
}[]): PartialParse; | |
/** | |
Configure the parser. Returns a new parser instance that has the | |
given settings modified. Settings not provided in `config` are | |
kept from the original parser. | |
*/ | |
configure(config: ParserConfig): LRParser; | |
/** | |
Tells you whether any [parse wrappers](#lr.ParserConfig.wrap) | |
are registered for this parser. | |
*/ | |
hasWrappers(): boolean; | |
/** | |
Returns the name associated with a given term. This will only | |
work for all terms when the parser was generated with the | |
`--names` option. By default, only the names of tagged terms are | |
stored. | |
*/ | |
getName(term: number): string; | |
/** | |
The type of top node produced by the parser. | |
*/ | |
get topNode(): NodeType; | |
/** | |
Used by the output of the parser generator. Not available to | |
user code. @hide | |
*/ | |
static deserialize(spec: any): LRParser; | |
} | |
export { ContextTracker, ExternalTokenizer, InputStream, LRParser, LocalTokenGroup, ParserConfig, Stack }; | |