홈으로 돌아가기

SWX: Node.js에서 AST와 암호화와 함께하는 당신만의 언어

SWX — 커스텀 구문, 암호화 및 HTML 생성기를 갖춘 Node.js 스크립팅 언어. 아키텍처 설명: lexer, AST를 사용한 parser, tree-walking interpreter. 코드 예제, 구현 복잡성 및 미래 계획 제공.

SWX v7: Node.js 상의 암호화 지원 언어 인터프리터
Advertisement 728x90

Node.js 기반 SWX 스크립트 언어 구축: 아키텍처와 구현

SWX는 Node.js 위에 구축된 스크립트 언어로, 코드 처리 파이프라인 전체를 담당합니다: 어휘 분석부터 실행까지. 이 과정에는 리커(lexer), 파서(parser), 인터프리터가 포함됩니다.

소스 코드 → [리커] → 토큰 → [파서] → AST → [인터프리터] → 결과

리커는 코드를 토큰으로 분해하며, >~ 같은 비교 연산자와 =? 같은 등식 연산자를 지원합니다. 파서는 AST를 생성하고, 인터프리터는 트리를 순회하며 노드를 실행합니다.

리커: 코드 토큰화

리커(lexer.js)는 문자열을 토큰 시퀀스로 변환합니다. 예시:

Google AdInline article slot
swx x = 42

이는 KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42)로 변환됩니다.

다중 문자 연산자 처리는 우선순위를 요구합니다: >=는 하나의 토큰으로 인식됩니다. HTML 생성기에서 식별자와의 충돌은 문맥 모드로 해결합니다.

파서와 AST

파서(parser.js)는 재귀 하강(recursive descent) 방식을 사용해 연산자 우선순위를 준수하며 AST를 구축합니다. 조건문 예시:

Google AdInline article slot
swx x = 10
sw x >~ 5 {
    wx "greater than five"
}

AST:

{
  "type": "IfStatement",
  "condition": {
    "type": "BinaryExpression",
    "operator": ">=",
    "left": { "type": "Identifier", "name": "x" },
    "right": { "type": "NumberLiteral", "value": 5 }
  },
  "body": [
    {
      "type": "PrintStatement",
      "value": { "type": "StringLiteral", "value": "greater than five" }
    }
  ]
}

우선순위가 올바르게 적용되어 2 + 3 42 + (3 4)로 평가됩니다.

인터프리터: AST 실행

트리 순회 인터프리터(interpreter.js)는 각 노드에 대한 핸들러를 구현합니다:

Google AdInline article slot
  • IfStatement: 조건 평가 후 분기 선택.
  • ForLoop: 카운터로 반복.
  • FunctionDeclaration: 심볼 테이블에 저장.
  • BinaryExpression: 산술 및 논리 연산 처리.

구문과 구조체

SWX는 독특한 구문을 가집니다:

변수와 출력

swx name = "SlywerX"
swx age = 20
wx "Hi, {name}! You're {age} years old."

조건문과 반복문

  • sw는 if문, dr는 else-if/else.
  • xs 5 { ... } — N회 반복.
  • xw item in arr { ... } — foreach.
  • xl condition { ... } — 100만 회 반복 제한이 있는 while.

함수와 패턴 매칭

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

match status {
    case 200 => { wx "OK" }
    case 404 => { wx "Not Found" }
    default  => { wx "Unknown" }
}

파이프 연산자 |>로 함수 체이닝: "hello" |> upper.

암호화

#x 모듈은 Node.js crypto를 통합합니다:

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

swx encrypted = #x.aes_enc("secret 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 렌더링

sx> DSL은 CSS와 함께 HTML을 생성합니다:

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 >> "Hello from SWX"
            button.btn >> (onclick: "alert('works!')") { "Click Me" }
        }
    }
}

중첩과 속성을 지원합니다.

구현 도전 과제

  • 파서 우선순위: Pratt 파싱을 사용한 재귀 하강.
  • 리커 충돌: *~와 CSS를 위한 문맥 처리.
  • while 반복문: 무한 루프 방지를 위한 반복 제한.
  • 표준 라이브러리: 불안정한 인터프리터에서의 테스트.

주요 요점

  • 풀스택: Node.js 기반 리커, 파서, 인터프리터.
  • 파이프, 패턴 매칭, 암호 모듈을 갖춘 커스텀 구문.
  • 마크업 생성을 위한 HTML DSL.
  • 무한 루프와 리커 충돌 방지 장치.
  • RSA와 AES를 포함한 버전 7.0.0.

— Editorial Team

Advertisement 728x90

다음 읽기