Skip to content

Commit

Permalink
add createError
Browse files Browse the repository at this point in the history
  • Loading branch information
Marcisbee committed Nov 27, 2024
1 parent 8bef9ec commit 9e98f48
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 23 deletions.
20 changes: 8 additions & 12 deletions .zed/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
// Folder-specific settings
//
// For a full list of overridable settings, and general information on folder-specific settings,
// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
{
"lsp": {
"deno": {
Expand All @@ -15,21 +11,21 @@
"languages": {
"TypeScript": {
"language_servers": [
"deno",
"!biome",
"!typescript-language-server",
"!vtsls",
"!eslint"
"!typescript-language-server",
"deno",
"!eslint",
"!biome"
],
"formatter": "language_server"
},
"TSX": {
"language_servers": [
"deno",
"!biome",
"!typescript-language-server",
"!vtsls",
"!eslint"
"!typescript-language-server",
"deno",
"!eslint",
"!biome"
],
"formatter": "language_server"
}
Expand Down
2 changes: 1 addition & 1 deletion deno.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@marcisbee/nanolex",
"version": "0.4.0",
"version": "0.5.0",
"exports": "./src/nanolex.ts"
}
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nanolex",
"version": "0.4.0",
"version": "0.5.0",
"description": "Parser grammar builder",
"main": "./dist/nanolex.js",
"module": "./dist/nanolex.mjs",
Expand Down
69 changes: 62 additions & 7 deletions src/nanolex.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
// deno-lint-ignore-file ban-unused-ignore no-explicit-any ban-types
type ErrorToken = {
got: string;
value?: string;
got?: string;
token?: TokenLike;
i: number;
};

type ComposedTokens = {
id: number;
tokensParse: RegExp;
};

export const EOF = Symbol("EOF") as any as TokenLike;

export function createToken(
Expand Down Expand Up @@ -42,7 +49,46 @@ const chunksCache: Record<string, string[]> = {};
export function nanolex(
value: string,
{ id, tokensParse }: ReturnType<typeof getComposedTokens>,
) {
): {
consume: <Return = string>(
token: TokenLike,
transform?: ((value: string) => Return) | undefined,
) => GrammarLike<(Return extends any ? string : Return) | undefined>;
consumeUntil: (token: TokenLike) => GrammarLike<any[]>;
peek: (rule: GrammarLike) => GrammarLike;
oneOrMany: (
rule: GrammarLike,
transformer?: ((value: any) => any) | undefined,
) => GrammarLike<any>;
zeroOrMany: (
rule: GrammarLike,
transformer?: ((value: any) => any) | undefined,
) => GrammarLike<any>;
oneOrManySep: (
rule: GrammarLike,
sep: GrammarLike,
transformer?: ((value: any) => any) | undefined,
) => GrammarLike<any>;
zeroOrManySep: (
rule: GrammarLike,
sep: GrammarLike,
transformer?: ((value: any) => any) | undefined,
) => GrammarLike<any>;
zeroOrOne: <T extends GrammarLike<any>>(rule: T) => GrammarLike;
not: (rule: GrammarLike) => GrammarLike;
and: <T extends GrammarLike<any>[]>(
rules: T,
transform?: ((value: any) => any) | undefined,
) => GrammarLike;
or: <T extends GrammarLike<any>[]>(
rules: T,
transform?: ((value: any) => any) | undefined,
) => GrammarLike;
breakLoop: <T extends Function>(type: number, fn: T) => T;
patternToSkip: (tokens: GrammarLike) => void;
throwIfError: <T extends GrammarLike<any>>(rule: T) => any;
createError: (value: string) => void;
} {
let skipCheck = false;
let tokensSkip: Function = () => void 0;
const loopIndexMap: Record<number, number> = {};
Expand Down Expand Up @@ -83,6 +129,7 @@ export function nanolex(
breakLoop,
patternToSkip,
throwIfError,
createError,
};

function patternToSkip(tokens: GrammarLike) {
Expand Down Expand Up @@ -110,6 +157,13 @@ export function nanolex(
return deepestError;
}

function createError(value: string) {
saveError({
value,
i,
});
}

function many(
rule: GrammarLike,
atLest: number,
Expand Down Expand Up @@ -390,12 +444,13 @@ export function nanolex(
// console.log({ consumeTimes });

if (i !== chunksLength && deepestError) {
const i = deepestError.i;
const i = deepestError.value ? deepestError.i - 1 : deepestError.i;

const [codeLens, position] = getCodeLens(chunks, i);
const deepestErrorMessage = `expecting "${
deepestError.token?.name ?? "EOF"
}", got "${deepestError.got ?? "EOF"}"`;
const deepestErrorMessage = deepestError.value ||
`expecting "${deepestError.token?.name ?? "EOF"}", got "${
deepestError.got ?? "EOF"
}"`;

throw new Error(`${deepestErrorMessage} at ${position}${codeLens}`);
}
Expand Down Expand Up @@ -459,7 +514,7 @@ interface TokenLike {
}

let composedTokenId = 0;
export function getComposedTokens(tokens: TokenLike[]) {
export function getComposedTokens(tokens: TokenLike[]): ComposedTokens {
return {
id: composedTokenId++,
tokensParse: new RegExp("(" + tokens.map((t) => t.source).join("|") + ")"),
Expand Down
1 change: 1 addition & 0 deletions tests/css.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// deno-lint-ignore-file ban-unused-ignore no-explicit-any no-unused-vars ban-types
import {
createToken,
EOF,
Expand Down
1 change: 1 addition & 0 deletions tests/jsexpression.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// deno-lint-ignore-file ban-unused-ignore no-explicit-any no-unused-vars ban-types
import {
createToken,
EOF,
Expand Down
1 change: 1 addition & 0 deletions tests/json.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// deno-lint-ignore-file ban-unused-ignore no-explicit-any no-unused-vars
import {
createToken,
EOF,
Expand Down

0 comments on commit 9e98f48

Please sign in to comment.