PXAML Pipeline

The PXAML pipeline transforms declarative UI markup into executable user interfaces.

Overview

PXAML (Markup) → Parser → IR (JSON) → Renderer → GUI/TUI/Web

Pipeline Phases

Phase 1: Parsing

The PXAML parser reads XML markup and produces an Abstract Syntax Tree (AST).

<!-- Input: PXAML -->
<Window Title="Demo" Width="400">
  <Button Content="Click me" Click="OnClick"/>
</Window>

Parser tasks:

  • XML validation
  • Namespace resolution
  • Element recognition
  • Attribute parsing
  • Event binding detection

Phase 2: IR Generation

The AST is transformed into an Intermediate Representation (IR) - a JSON-based intermediate format.

{
  "type": "Window",
  "properties": {
    "Title": { "value": "Demo", "type": "string" },
    "Width": { "value": 400, "type": "number" }
  },
  "children": [
    {
      "type": "Button",
      "properties": {
        "Content": { "value": "Click me", "type": "string" }
      },
      "events": {
        "Click": { "handler": "OnClick" }
      }
    }
  ]
}

IR properties:

  • Platform-independent
  • Serializable (JSON)
  • Diff-capable for hot reload
  • Type information preserved

Phase 3: Binding Resolution

Data bindings are analyzed and converted into executable structures.

<!-- PXAML with Binding -->
<TextBox Text="{Binding Path=UserName, Mode=TwoWay}"/>
{
  "type": "TextBox",
  "properties": {
    "Text": {
      "type": "binding",
      "path": "UserName",
      "mode": "TwoWay"
    }
  }
}

Phase 4: Rendering

The IR is translated by the target-specific renderer into native UI elements.

Renderer Output Technology
GUI Native Controls LCL/WinAPI
TUI Terminal characters ANSI/VT100
Web DOM Elements HTML/CSS

Components

TWvdSPxamlParser

type
  TWvdSPxamlParser = class
  public
    function Parse(const ASource: string): TWvdSIRNode;
    function ParseFile(const APath: string): TWvdSIRNode;
  end;

TWvdSIRNode

type
  TWvdSIRNode = class
    NodeType: string;
    Properties: TWvdSPropertyMap;
    Children: TWvdSIRNodeList;
    Events: TWvdSEventMap;
    Bindings: TWvdSBindingList;
  end;

TWvdSRenderer (Abstract)

type
  TWvdSRenderer = class abstract
  public
    procedure Render(ARoot: TWvdSIRNode); virtual; abstract;
    procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract;
  end;

Hot Reload

The pipeline supports hot reload through IR differentiation:

1. New PXAML → Parser → New IR
2. Diff(Old IR, New IR) → Patch List
3. Renderer.ApplyPatches(Patch List)

Benefits:

  • Only changed elements are updated
  • State is preserved
  • Fast iteration during development

Error Handling

Error Type Phase Handling
XML syntax error Parsing Position + message
Unknown element Parsing Warning + fallback
Invalid property type IR Type coercion + warning
Binding error Binding Fallback value

See Also

Zuletzt geändert: on 2026/01/29 at 10:25 PM