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:
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:
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:
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
swpro if sdrjako 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
Zatím žádné komentáře.