크라우니워드프로세서 기초도구 — 버전비교(diff/merge)
개요
크라우니워드프로세서 기초도구 시리즈의 "버전비교" 도메인. 완전 한선씨(hanseonc_high) 자기완결 파일.
텍스트/문서의 줄단위 diff, unified 스타일 표시, 변경블록 추출, 3-way 병합(충돌마커), 유사도, 패치 직렬화/적용까지 커버.
파일
/Users/ef/crowny-word/도구/버전비교.한선구현 함수 (10개 명세 + 6개 헬퍼)
줄diff(A,B) — LCS DP 기반 정확 diff. 접두/접미 공통줄을 먼저 잘라내(접두접미최적화) core만 DP. core (mm+1)*(nn+1) > 800이면(배열캡 1023 보호) 근사(전체 삭제+삽입)로 축소 — 실측 40x40(dp=1681) 근사경로 정상 동작 확인.
diff텍스트(t1,t2) — " "/"- "/"+ " 접두 unified 스타일 문자열
변경블록추출(ops) — 연속 동일코드 구간을 "코드\t시작\t개수" 블록 배열로
접두접미최적화(A,B) — 공통 접두 p, 공통 접미 q 계산 → [p,q]
삼방병합기초(베이스,우리,그들) — 줄수 같으면 줄단위 병합(동일=채택, 상충=<<<<<<< 우리 / ======= / >>>>>>> 그들 마커), 줄수 다르면(구조적 변경) 전체단위 규칙(ours==base→theirs, theirs==base→ours, ours==theirs→채택, 그외→전체충돌)
충돌마커파싱(병합텍스트) — 마커 밖/우리/그들 구간을 "=:"/"O:"/"T:" 태그 배열로 역파싱
유사도비율(t1,t2) — difflib류 2*M/(lenA+lenB)*100 정수 백분율
diff통계(t1,t2) — [추가,삭제,동일] 카운트
직렬화(ops) / 패치적용(원본,패치) — ops↔patch문자열 왕복, 패치 적용으로 텍스트2 재구성(왕복 검증됨)
헬퍼:
줄분리 줄조인 op코드 op내용 배열슬라이스 배열문자열같다 역직렬화 확인(자체시험 assert)
명세 대비 변경점
3방병합기초 → 삼방병합기초로 개명. 숫자로 시작하는 식별자는 hanseonc_high 컴파일 실패
(
함수명 기대, '3' 발견 실측) — 로직 100% 동일, 이름만 회피.
발견한 VM 함정 (이번 작업 실측)
그리고(AND)는 단락평가(short-circuit) 아님(의심) — LCS 역추적 루프에서
만약(ri>0 그리고 ci>0 그리고 꺼내(coreA,ri-1)==꺼내(coreB,ci-1))처럼 앞 조건이 뒤 배열접근의
안전가드 역할을 기대하는 패턴이
배열 범위 초과: 인덱스 -1 (길이 1) 런타임 에러로 실측됨.
가드가 필요한 배열접근은
그리고 체인 안에 넣지 말고 중첩
만약으로 분리해야 안전.
- 커스텀 "값 오프셋 후 되돌리기" 방식의 조건 분기(
p = 최소+999 후 나중에 빼기)는 제어흐름
버그를 유발하기 쉬움 — 플래그 변수(
계속중 등) + 중첩
만약으로 짜는 편이 안전.
- 예약어
계속은 변수명 불가(재확인, 더돌기로 회피).
검증
cd /Users/ef/CrownyOS/crownyc
./hanseonc_high /Users/ef/crowny-word/도구/버전비교.한선 > /tmp/버전비교.toau 2>/tmp/버전비교.err
./crownyc run /tmp/버전비교.toau
# 검사: PASS 33/33
근사경로(dp>800) 별도 수동검증: 40x40 입력에서 정확히 40삭제+40추가 산출(크래시 없음).
크라우니코드
lookup/search HIT 0건(신규 도메인, "diff_tool"/"병합" 계열 인텐트만 유사 존재, 코드 재사용 불가한 스텁급) / MISS 1건(전체 신규 작성) / learn 추가 4건(
줄diff_LCS,
삼방병합기초_충돌마커,
패치적용_직렬화왕복,
유사도비율_difflib방식)
잔여 이슈
줄diff의 근사 경로(대량 diff)는 정확한 최소 편집이 아니라 core 전체 교체 — 실사용에서 큰 파일(수백 줄 이상 변경) diff 품질은 저하됨(문서화된 트레이드오프).
삼방병합기초는 줄수가 다른 구조적 변경 시 라인단위가 아닌 전체단위 병합/충돌로 축소 — 진짜 3-way 라인병합(base 앵커 재정렬)은 범위 밖.