diff --git a/SPEC.AUDIT.md b/SPEC.AUDIT.md index bb85cc0..69e3742 100644 --- a/SPEC.AUDIT.md +++ b/SPEC.AUDIT.md @@ -14,3 +14,15 @@ - 명세 반영: 예제의 비교를 `c.^ == '\n' as u8`로 수정하고 §4.1에 규칙을 명시했다. - 구현 영향: 타입 검사기는 `char`를 독립 기본 타입으로 취급해야 하고, C 방출 시 같은 크기의 정수 표현을 사용할 수 있어도 Ferro 단계에서는 `char`/`u8` 혼용을 거부해야 한다. + +## 2026-08-16 — v0.1.4 + +### `match` scrutinee와 구조체 초기화의 중괄호 모호성 + +- 문제: `match expr { arms }`와 `Type{ fields }`가 모두 식별자 뒤에 `{`를 사용하므로 + `match value { ... }`의 arm 블록을 구조체 초기화로 잘못 소비할 수 있었다. +- 결정: `match` scrutinee 바로 뒤의 `{`는 항상 arm 블록으로 해석한다. 구조체 초기화식 + 자체를 scrutinee로 쓸 때는 `match (Type{ ... }) { ... }`처럼 괄호가 필수다. +- 구현 영향: match 문맥의 식 파서는 최상위 `{` 앞에서 scrutinee 파싱을 멈춰야 하며, + 괄호 안에서는 일반 구조체 초기화 규칙을 그대로 적용한다. 오류 복구는 모든 반복에서 + 적어도 한 토큰을 소비해 같은 진단을 무한 반복하지 않아야 한다. diff --git a/SPEC.md b/SPEC.md index 4c68c0a..fa81df6 100644 --- a/SPEC.md +++ b/SPEC.md @@ -1,4 +1,4 @@ -# Ferro 언어 명세 v0.1.3 +# Ferro 언어 명세 v0.1.4 DOS용 시스템 프로그래밍 언어. C만큼 빠르고, 메모리 안전성을 함수 단위 지역 검사만으로 보장한다. 파일 확장자 `.fe`, 컴파일러 이름 `fec`, 심볼 파일 `.fei`. @@ -450,6 +450,9 @@ pub fn main() -> !void { - 이 루프 형태들은 경계 검사를 생략한다(컴파일러가 안전을 보장). - `while`은 `bool` 조건만. - `match`는 **완전성 검사**. 모든 배리언트를 다루거나 `_` 필요. +- `match expr { ... }`에서 scrutinee 바로 뒤의 `{`는 항상 arm 블록을 시작한다. + 따라서 구조체 초기화식을 scrutinee로 직접 쓸 때는 `match (Point{ x: 1, y: 2 }) { ... }`처럼 + 괄호로 감싸 구조체 초기화의 `{`를 명시한다. - `break`/`continue`는 가장 안쪽 루프에만 적용(레이블 없음). - `defer block`은 스코프 종료 시 역순 실행. 소멸자와 함께 선언 역순으로 병합 실행. `return`/`break`/에러 전파 경로에서도 실행.