← 목록
기타 2026-07-12 4KB 읽기 4분

크라우니워드프로세서 기초도구 — 마크다운왕복

개요

크라우니워드프로세서 기초도구 시리즈 중 "마크다운왕복" 도메인을 완전 한선씨(hanseonc_high)로 작성. 문서를 블록 배열로 표현하고 마크다운 텍스트로 내보내기/파싱하는 양방향(왕복) 변환기.

무엇을 했는지

  • 파일: /Users/ef/crowny-word/도구/마크다운왕복.한선 (자기완결, 가져오기 없음)
  • 내부 문서표현: 블록배열(각 원소="타입#내용"), 타입 = H1~H6/P/HR/QUOTE/UL/OL/CODE/TABLE. 줄구분자 "¶", 서브필드구분자 "|".
  • 구현 함수(핵심 10 + 보조 다수):
  • MD내보내기확장(블록배열→MD텍스트, 헤딩/문단/표/코드블록(백틱3)/인용/수평선/중첩목록 전부 지원)
  • MD파싱확장(MD텍스트→블록배열, 역방향 전 요소)
  • 표MD왕복(행배열 내보내기+파싱 후 일치검증)
  • 중첩목록/중첩목록파싱(2칸 들여쓰기)
  • 코드블록보존/코드블록추출(펜스 내부 내용 마크다운 해석 없이 그대로 보존 검증)
  • 인용블록/인용블록파싱(">" 중첩 레벨)
  • 수평선/수평선인가
  • MD이스케이프/MD언이스케이프(특수문자 백슬래시 이스케이프 왕복)
  • 왕복시험함수(임의 블록배열의 내보내기→파싱 완전일치 검증)
  • 요소통계(H/BOLD/ITALIC/STRIKE/LINK/IMG/CODEINLINE/CODEBLOCK/TABLE/QUOTE/HR/UL/OL 카운트)
  • 굵게MD/기울임MD/취소선MD/링크MD/이미지MD/인라인코드MD 인라인 빌더
  • 기존 도구 이식: 검색치환.한선의 매치있나/검색첫/치환전부/검색개수 계열을 로컬 헬퍼(매치있나/찾기/치환전부/개수세기)로 이식, 서식런.한선의 나누기/합치기 계열 이식.
  • 자체시험 40 assert 전부 통과: 검사: PASS 40/40
  • 신규 발견 VM 함정 (중요 — 가드레일/메모리 갱신 대상)

    한선씨 그리고(AND)는 단락평가(short-circuit)가 아니다. hanseonc_high.c의 parse_logic_and()가 양쪽 피연산자를 무조건 둘 다 평가한 뒤 OP_AND를 방출함(코드 확인: 2752행 부근, 조건부 점프 없음). 따라서:
    동안 (i < n 그리고 꺼내(배열, i) == x) { ... }
    
    형태는 i == n(경계)에 도달해도 꺼내(배열, i)를 평가해버려 "배열 범위 초과(array out of bounds)" 런타임 에러가 출력된다(결과 자체는 좌변이 이미 거짓이라 무해하게 무시되지만, stderr에 에러가 계속 찍혀 노이즈+오해 소지).
    • 실측: 이 파일 초안에서 3곳(코드펜스 탐색 루프, 표 데이터행 탐색 루프 2곳)이 이 패턴이었고, 실행 시 PC: 4997에서 반복적으로 "인덱스 N (길이 N)" 에러가 발생(정확히 경계값과 일치 — 결과는 40/40 PASS로 무해했음을 확인 후 근본수정).
    • 수정 패턴: 동안(i<n){ 만약(조건){실행} 아니면{ 탈출 } } 형태로 경계검사를 AND 밖으로 분리. 탈출 키워드(TOK_BREAK, 별칭 반복끝/멈춰)가 정상 동작 확인됨.
    • 학습 등록: han_and_not_shortcircuit_bounds_guard (크라우니코드 학습DB).

    관련 파일

    • /Users/ef/crowny-word/도구/마크다운왕복.한선 (신규, 이 작업 산출물)
    • /Users/ef/crowny-word/도구/검색치환.한선 (이식 원본 — 매치있나/검색첫/치환전부/검색개수)
    • /Users/ef/crowny-word/도구/서식런.한선 (이식 원본 — 나누기/합치기)
    • /Users/ef/crowny-word/도구/문단배치.한선 (이식 원본 — 줄나누기 내부로직 참고)
    • /Users/ef/CrownyOS/crownyc/hanseonc_high.c (그리고 AND 비단락평가 확인 지점, parse_logic_and 2752행)

    잔여 이슈

    • 이스케이프 규약: TABLE 셀/UL·QUOTE 텍스트에 리터럴 |가 포함되면 셀 경계와 충돌(파일 상단 주석에 명기, 이번 스코프에서는 미해결 — 필요시 \| 이스케이프 별도 구현 필요).
    • 요소통계의 ITALIC 카운트는 **...** 제거 후 남은 단독 * 쌍을 세는 근사 방식(***중첩*** 같은 굵게+기울임 결합 마커는 스코프 밖).
    • 그리고 비단락평가 함정은 이 파일 국소 수정만 완료 — 다른 기존 9개 도구 파일(텍스트버퍼·커서선택 등)에도 같은 패턴이 잠재할 수 있어 전수 점검은 별도 작업 필요(이번 작업 범위 아님, 기존 파일 수정 금지 지시로 미확인).