Zpět na domů

SWX: svůj jazyk na Node.js s AST a kryptografií

SWX — skriptovací jazyk na Node.js s vlastním syntaxí, kryptografií a HTML-generátorem. Popis architektury: lexer, parser s AST, tree-walking interpretátor. Uvedeny příklady kódu, složitosti implementace a budoucí plány.

SWX v7: interpretátor jazyka s kryptografií na Node.js
Advertisement 728x90

Vytvoření skriptovacího jazyka SWX na Node.js: architektura a implementace

SWX je skriptovací jazyk založený na Node.js, který implementuje celý cyklus zpracování kódu: od lexikální analýzy po vykonání. Proces zahrnuje lexer, parser a interpret.

Zdrojový kód → [Lexer] → Tokeny → [Parser] → AST → [Interpret] → Výsledek

Lexer rozděluje kód na tokeny, zohledňující vlastní operátory jako >~ pro porovnání a =? pro rovnost. Parser vytváří AST, interpret prochází strom a vykonává uzly.

Lexer: tokenizace kódu

Lexer (lexer.js) převádí řetězce na sekvenci tokenů. Příklad:

Google AdInline article slot
swx x = 42

Stává se: KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42).

Zpracování vícesymbolových operátorů vyžaduje prioritu: >= je rozpoznán jako celek. Kontextové režimy řeší konflikty s identifikátory v HTML-generátoru.

Parser a AST

Parser (parser.js) používá rekurzivní sestup pro vytvoření AST s ohledem na priority operátorů. Příklad podmínky:

Google AdInline article slot
swx x = 10
sw x >~ 5 {
    wx "více než pět"
}

AST:

{
  "type": "IfStatement",
  "condition": {
    "type": "BinaryExpression",
    "operator": ">=",
    "left": { "type": "Identifier", "name": "x" },
    "right": { "type": "NumberLiteral", "value": 5 }
  },
  "body": [
    {
      "type": "PrintStatement",
      "value": { "type": "StringLiteral", "value": "více než pět" }
    }
  ]
}

Priority zajišťují správnost: 2 + 3 4 se vyhodnotí jako 2 + (3 4).

Interpret: vykonávání AST

Tree-walking interpret (interpreter.js) implementuje handlery pro uzly:

Google AdInline article slot
  • IfStatement: vyhodnocení podmínky a výběr větve.
  • ForLoop: iterace podle čítače.
  • FunctionDeclaration: uložení v tabulce symbolů.
  • BinaryExpression: aritmetika a logika.

Syntaxe a konstrukce

SWX používá unikátní syntaxi:

Proměnné a výstup

swx name = "SlywerX"
swx age = 20
wx "Ahoj, {name}! Je ti {age} let."

Podmínky a cykly

  • sw pro if s dr jako else-if/else.
  • xs 5 { ... } — cyklus N krát.
  • xw item in arr { ... } — foreach.
  • xl condition { ... } — while s limitem 1 milion iterací.

Funkce a pattern matching

sx add(a, b = 0) => {
    ws a + b
}

match status {
    case 200 => { wx "OK" }
    case 404 => { wx "Nenalezeno" }
    default  => { wx "Neznámé" }
}

Pipe-operátor |> řetězí funkce: "hello" |> upper.

Kryptografie

Modul #x integruje Node.js crypto:

swx hash = #x.sha256("hello")
wx hash  // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

swx encrypted = #x.aes_enc("tajná data", "mykey")
swx decrypted = #x.aes_dec(encrypted, "mykey")

swx keys = #x.rsa_keys(2048)
swx signature = #x.rsa_sign("data", keys.private)
wx #x.rsa_verify("data", signature, keys.public)  // true

HTML-rendering

DSL sx> generuje HTML s CSS:

sx> "output/index.html" {
    @style {
        body   >> bg(#030810) color(#fff) font(Courier New, monospace)
        h1     >> color(#00e5ff) size(24px) bold uppercase
        .btn   >> bg(#00e5ff) color(#000) pad(10px 20px) pointer
    }
    @body {
        div.card >> {
            h1 >> "Ahoj od SWX"
            button.btn >> (onclick: "alert('funguje')") { "Klikni" }
        }
    }
}

Podporuje vnořování a atributy.

Obtíže implementace

  • Priority v parseru: Rekurzivní sestup s Pratt-parsingem.
  • Lexer-konflikty: Kontext pro *~ a CSS.
  • While-cykly: Ochrana proti zacyklení limitem iterací.
  • Standardní knihovna: Testování na nestabilním interpretu.

Co je důležité

  • Celý stack: lexer, parser, interpret na Node.js.
  • Vlastní syntaxe s pipe, pattern matching a krypto-modulem.
  • HTML-DSL pro generování značek.
  • Ochrana proti nekonečným cyklům a lexikálním konfliktům.
  • Verze 7.0.0 s RSA a AES.

— Editorial Team

Advertisement 728x90

Číst dál