Node.js 기반 SWX 스크립트 언어 구축: 아키텍처와 구현
SWX는 Node.js 위에 구축된 스크립트 언어로, 코드 처리 파이프라인 전체를 담당합니다: 어휘 분석부터 실행까지. 이 과정에는 리커(lexer), 파서(parser), 인터프리터가 포함됩니다.
소스 코드 → [리커] → 토큰 → [파서] → AST → [인터프리터] → 결과
리커는 코드를 토큰으로 분해하며, >~ 같은 비교 연산자와 =? 같은 등식 연산자를 지원합니다. 파서는 AST를 생성하고, 인터프리터는 트리를 순회하며 노드를 실행합니다.
리커: 코드 토큰화
리커(lexer.js)는 문자열을 토큰 시퀀스로 변환합니다. 예시:
swx x = 42
이는 KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42)로 변환됩니다.
다중 문자 연산자 처리는 우선순위를 요구합니다: >=는 하나의 토큰으로 인식됩니다. HTML 생성기에서 식별자와의 충돌은 문맥 모드로 해결합니다.
파서와 AST
파서(parser.js)는 재귀 하강(recursive descent) 방식을 사용해 연산자 우선순위를 준수하며 AST를 구축합니다. 조건문 예시:
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 4는 2 + (3 4)로 평가됩니다.
인터프리터: AST 실행
트리 순회 인터프리터(interpreter.js)는 각 노드에 대한 핸들러를 구현합니다:
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
아직 댓글이 없습니다.