From 0b6210cd37b68b94252cb798598b12974a20e1c1 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 21 May 2024 22:56:19 +0200 Subject: Adding upstream version 5.28.2+dfsg1+~cs23.11.12.3. Signed-off-by: Daniel Baumann --- llparse-frontend/src/node/base.ts | 46 +++++++++++++++++++++++++++++++ llparse-frontend/src/node/consume.ts | 8 ++++++ llparse-frontend/src/node/empty.ts | 4 +++ llparse-frontend/src/node/error.ts | 9 ++++++ llparse-frontend/src/node/index.ts | 13 +++++++++ llparse-frontend/src/node/invoke.ts | 39 ++++++++++++++++++++++++++ llparse-frontend/src/node/match.ts | 11 ++++++++ llparse-frontend/src/node/pause.ts | 4 +++ llparse-frontend/src/node/sequence.ts | 44 +++++++++++++++++++++++++++++ llparse-frontend/src/node/single.ts | 46 +++++++++++++++++++++++++++++++ llparse-frontend/src/node/slot.ts | 20 ++++++++++++++ llparse-frontend/src/node/span-end.ts | 12 ++++++++ llparse-frontend/src/node/span-start.ts | 12 ++++++++ llparse-frontend/src/node/table-lookup.ts | 43 +++++++++++++++++++++++++++++ 14 files changed, 311 insertions(+) create mode 100644 llparse-frontend/src/node/base.ts create mode 100644 llparse-frontend/src/node/consume.ts create mode 100644 llparse-frontend/src/node/empty.ts create mode 100644 llparse-frontend/src/node/error.ts create mode 100644 llparse-frontend/src/node/index.ts create mode 100644 llparse-frontend/src/node/invoke.ts create mode 100644 llparse-frontend/src/node/match.ts create mode 100644 llparse-frontend/src/node/pause.ts create mode 100644 llparse-frontend/src/node/sequence.ts create mode 100644 llparse-frontend/src/node/single.ts create mode 100644 llparse-frontend/src/node/slot.ts create mode 100644 llparse-frontend/src/node/span-end.ts create mode 100644 llparse-frontend/src/node/span-start.ts create mode 100644 llparse-frontend/src/node/table-lookup.ts (limited to 'llparse-frontend/src/node') diff --git a/llparse-frontend/src/node/base.ts b/llparse-frontend/src/node/base.ts new file mode 100644 index 0000000..1e93c49 --- /dev/null +++ b/llparse-frontend/src/node/base.ts @@ -0,0 +1,46 @@ +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Slot } from './slot'; + +export interface IReadonlyOtherwiseEdge { + readonly node: IWrap; + readonly noAdvance: boolean; + readonly value: number | undefined; +} + +interface IOtherwiseEdge { + node: IWrap; + readonly noAdvance: boolean; + readonly value: number | undefined; +} + +export abstract class Node { + private privOtherwise: IOtherwiseEdge | undefined; + private privSlots: ReadonlyArray | undefined; + + constructor(public readonly id: IUniqueName) { + } + + public setOtherwise(node: IWrap, noAdvance: boolean, value?: number) { + this.privOtherwise = { node, noAdvance, value }; + } + + public get otherwise(): IReadonlyOtherwiseEdge | undefined { + return this.privOtherwise; + } + + public *getSlots() { + if (this.privSlots === undefined) { + this.privSlots = Array.from(this.buildSlots()); + } + + yield* this.privSlots; + } + + protected *buildSlots() { + const otherwise = this.privOtherwise; + if (otherwise !== undefined) { + yield new Slot(otherwise.node, (value) => otherwise.node = value); + } + } +} diff --git a/llparse-frontend/src/node/consume.ts b/llparse-frontend/src/node/consume.ts new file mode 100644 index 0000000..6ab49ac --- /dev/null +++ b/llparse-frontend/src/node/consume.ts @@ -0,0 +1,8 @@ +import { IUniqueName } from '../utils'; +import { Node } from './base'; + +export class Consume extends Node { + constructor(id: IUniqueName, readonly field: string) { + super(id); + } +} diff --git a/llparse-frontend/src/node/empty.ts b/llparse-frontend/src/node/empty.ts new file mode 100644 index 0000000..45c552c --- /dev/null +++ b/llparse-frontend/src/node/empty.ts @@ -0,0 +1,4 @@ +import { Node } from './base'; + +export class Empty extends Node { +} diff --git a/llparse-frontend/src/node/error.ts b/llparse-frontend/src/node/error.ts new file mode 100644 index 0000000..c4e6faf --- /dev/null +++ b/llparse-frontend/src/node/error.ts @@ -0,0 +1,9 @@ +import { IUniqueName } from '../utils'; +import { Node } from './base'; + +export class Error extends Node { + constructor(id: IUniqueName, public readonly code: number, + public readonly reason: string) { + super(id); + } +} diff --git a/llparse-frontend/src/node/index.ts b/llparse-frontend/src/node/index.ts new file mode 100644 index 0000000..bd11015 --- /dev/null +++ b/llparse-frontend/src/node/index.ts @@ -0,0 +1,13 @@ +export * from './base'; +export * from './consume'; +export * from './empty'; +export * from './error'; +export * from './invoke'; +export * from './match'; +export * from './pause'; +export * from './sequence'; +export * from './single'; +export * from './slot'; +export * from './span-end'; +export * from './span-start'; +export * from './table-lookup'; diff --git a/llparse-frontend/src/node/invoke.ts b/llparse-frontend/src/node/invoke.ts new file mode 100644 index 0000000..ba6ef53 --- /dev/null +++ b/llparse-frontend/src/node/invoke.ts @@ -0,0 +1,39 @@ +import { Code } from '../code'; +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; +import { Slot } from './slot'; + +interface IInvokeEdge { + readonly code: number; + node: IWrap; +} + +export interface IReadonlyInvokeEdge { + readonly code: number; + readonly node: IWrap; +} + +export class Invoke extends Node { + private readonly privEdges: IInvokeEdge[] = []; + + constructor(id: IUniqueName, public readonly code: IWrap) { + super(id); + } + + public addEdge(code: number, node: IWrap): void { + this.privEdges.push({ code, node }); + } + + public get edges(): ReadonlyArray { + return this.privEdges; + } + + protected *buildSlots() { + for (const edge of this.privEdges) { + yield new Slot(edge.node, (value) => edge.node = value); + } + + yield* super.buildSlots(); + } +} diff --git a/llparse-frontend/src/node/match.ts b/llparse-frontend/src/node/match.ts new file mode 100644 index 0000000..8a499d3 --- /dev/null +++ b/llparse-frontend/src/node/match.ts @@ -0,0 +1,11 @@ +import { Transform } from '../transform'; +import { IWrap } from '../wrap'; +import { Node } from './base'; + +export class Match extends Node { + public transform?: IWrap; + + public setTransform(transform: IWrap): void { + this.transform = transform; + } +} diff --git a/llparse-frontend/src/node/pause.ts b/llparse-frontend/src/node/pause.ts new file mode 100644 index 0000000..b9923d7 --- /dev/null +++ b/llparse-frontend/src/node/pause.ts @@ -0,0 +1,4 @@ +import { Error as ErrorNode } from './error'; + +export class Pause extends ErrorNode { +} diff --git a/llparse-frontend/src/node/sequence.ts b/llparse-frontend/src/node/sequence.ts new file mode 100644 index 0000000..c9105b3 --- /dev/null +++ b/llparse-frontend/src/node/sequence.ts @@ -0,0 +1,44 @@ +import * as assert from 'assert'; +import { Buffer } from 'buffer'; + +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; +import { Match } from './match'; +import { Slot } from './slot'; + +interface ISequenceEdge { + node: IWrap; + readonly value: number | undefined; +} + +export interface IReadonlySequenceEdge { + readonly node: IWrap; + readonly value: number | undefined; +} + +export class Sequence extends Match { + private privEdge?: ISequenceEdge; + + constructor(id: IUniqueName, public readonly select: Buffer) { + super(id); + } + + public setEdge(node: IWrap, value?: number | undefined) { + assert.strictEqual(this.privEdge, undefined); + this.privEdge = { node, value }; + } + + public get edge(): IReadonlySequenceEdge | undefined { + return this.privEdge; + } + + protected *buildSlots() { + const edge = this.privEdge; + if (edge !== undefined) { + yield new Slot(edge.node, (value) => edge.node = value); + } + + yield* super.buildSlots(); + } +} diff --git a/llparse-frontend/src/node/single.ts b/llparse-frontend/src/node/single.ts new file mode 100644 index 0000000..0acf715 --- /dev/null +++ b/llparse-frontend/src/node/single.ts @@ -0,0 +1,46 @@ +import * as assert from 'assert'; + +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; +import { Match } from './match'; +import { Slot } from './slot'; + +interface ISingleEdge { + readonly key: number; + node: IWrap; + readonly noAdvance: boolean; + readonly value: number | undefined; +} + +export interface IReadonlySingleEdge { + readonly key: number; + node: IWrap; + readonly noAdvance: boolean; + readonly value: number | undefined; +} + +export class Single extends Match { + private readonly privEdges: ISingleEdge[] = []; + + public addEdge(edge: IReadonlySingleEdge): void { + this.privEdges.push({ + key: edge.key, + noAdvance: edge.noAdvance, + node: edge.node, + value: edge.value, + }); + } + + public get edges(): ReadonlyArray { + return this.privEdges; + } + + protected *buildSlots() { + for (const edge of this.privEdges) { + yield new Slot(edge.node, (value) => edge.node = value); + } + + yield* super.buildSlots(); + } +} diff --git a/llparse-frontend/src/node/slot.ts b/llparse-frontend/src/node/slot.ts new file mode 100644 index 0000000..923da86 --- /dev/null +++ b/llparse-frontend/src/node/slot.ts @@ -0,0 +1,20 @@ +import { IWrap } from '../wrap'; +import { Node } from './base'; + +export class Slot { + private privNode: IWrap; + + constructor(node: IWrap, + private readonly privUpdate: (value: IWrap) => void) { + this.privNode = node; + } + + public get node(): IWrap { + return this.privNode; + } + + public set node(value: IWrap) { + this.privNode = value; + this.privUpdate(value); + } +} diff --git a/llparse-frontend/src/node/span-end.ts b/llparse-frontend/src/node/span-end.ts new file mode 100644 index 0000000..bf8d5cc --- /dev/null +++ b/llparse-frontend/src/node/span-end.ts @@ -0,0 +1,12 @@ +import { Span } from '../code'; +import { SpanField } from '../span-field'; +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; + +export class SpanEnd extends Node { + constructor(id: IUniqueName, public readonly field: SpanField, + public readonly callback: IWrap) { + super(id); + } +} diff --git a/llparse-frontend/src/node/span-start.ts b/llparse-frontend/src/node/span-start.ts new file mode 100644 index 0000000..89690f1 --- /dev/null +++ b/llparse-frontend/src/node/span-start.ts @@ -0,0 +1,12 @@ +import { Span } from '../code'; +import { SpanField } from '../span-field'; +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; + +export class SpanStart extends Node { + constructor(id: IUniqueName, public readonly field: SpanField, + public readonly callback: IWrap) { + super(id); + } +} diff --git a/llparse-frontend/src/node/table-lookup.ts b/llparse-frontend/src/node/table-lookup.ts new file mode 100644 index 0000000..9880fc7 --- /dev/null +++ b/llparse-frontend/src/node/table-lookup.ts @@ -0,0 +1,43 @@ +import * as assert from 'assert'; + +import { IUniqueName } from '../utils'; +import { IWrap } from '../wrap'; +import { Node } from './base'; +import { Match } from './match'; +import { Slot } from './slot'; + +interface ITableEdge { + readonly keys: ReadonlyArray; + node: IWrap; + readonly noAdvance: boolean; +} + +export interface IReadonlyTableEdge { + readonly keys: ReadonlyArray; + readonly node: IWrap; + readonly noAdvance: boolean; +} + +export class TableLookup extends Match { + private readonly privEdges: ITableEdge[] = []; + + public addEdge(edge: IReadonlyTableEdge): void { + this.privEdges.push({ + keys: edge.keys, + noAdvance: edge.noAdvance, + node: edge.node, + }); + } + + public get edges(): ReadonlyArray { + return this.privEdges; + } + + protected *buildSlots() { + for (const edge of this.privEdges) { + yield new Slot(edge.node, (value) => edge.node = value); + } + + yield* super.buildSlots(); + } +} -- cgit v1.2.3