NovaShell - Undefs

이전 게시물에서 ifdef와 그 이점에 대해 살펴보았습니다. 불행히도 D3 10.2는 정의 문을 처리하지 않습니다. ifdefs를 수행할 수 있지만 정의가 작동하지 않으면 모두 무의미합니다. 이것은 10.3에서 수정되었으므로 NovaShell은 UniVerse 및 D3 10.3 이상에서만 작동합니다.

NovaShell이 ​​D3 10.2에서 작동하도록 하려면 ifdef를 제거하고 UniVerse 특정 코드를 제거해야 합니다. ifdefs에 대한 검색만 수행하는 것이 간단하기 때문에 이 작업을 수동으로 수행할 수 있지만 변경할 때마다 이 단계를 수행해야 합니다.

이미 이 작업을 수행하는 도구가 있어야 한다고 생각했습니다. 실제로 코드를 컴파일하지 않고 조건부 컴파일 단계를 수행하려는 사람이 있을 수 있습니다. 정의를 읽고 ifdef와 불필요한 코드 블록을 제거할 수 있는 프로그램이 있어야 합니다.

내가 맞았 어! C에서 이 작업을 수행하는 도구가 있었습니다.

http://dotat.at/prog/unifdef/

불행히도 NovaShell과 함께 작동하도록 시도했지만 예상보다 약간 어려웠습니다. 나는 그것을하기 위해 내 자신의 루틴을 작성하는 것이 더 빠를 것이라고 결정했습니다.

몇 단어만 구문 분석하면 되기 때문에 매우 간단한 프로그램이며 입력을 제어하고 이를 강력하게 만들 계획이 없기 때문에 극단적인 경우에 대해 걱정할 필요가 없습니다.

나는 단순히 파이썬으로 파일을 읽고 줄을 반복합니다. 정의를 찾으면 기호 테이블에 기호를 추가했습니다. ifdef를 찾으면 사용하는 기호와 기호 테이블에 있는지 확인합니다. 그렇지 않은 경우 해당 코드 블록을 제거하고 존재하는 경우 해당 코드 블록을 유지합니다.

가장 까다로운 부분은 ifdefs의 중첩이지만 이 또한 간단한 문제입니다. 이것은 실제로 실현하는 것이 재미 있었던 일반적인 인터뷰 질문입니다. 문제는 스택으로 수행되는 균형 괄호로 귀결됩니다.

#!/usr/bin/env python3

import sys

f = open(sys.argv[1], "r")

lines = f.readlines()

symbolTable = { }

counter = 0

while counter < len(lines):
    line = lines[counter]
    counter = counter + 1

    if "$DEFINE" in line:
        line = line.strip()
        _, symbol = line.split(" ")
        symbolTable[symbol] = True
        continue

    if "$IFDEF" in line:
        line = line.strip()
        _, symbol = line.split(" ")
        if symbol in symbolTable:
            continue
        line = lines[counter]
        stack = 1
        while stack != 0:
            if "$IFDEF" in line:
                stack = stack + 1
            if "$ENDIF" in line:
                stack = stack - 1
            counter = counter + 1
            line = lines[counter]
        continue

    if "$ENDIF" in line:
        continue

    print(line[:-1])

f.close()


이것은 전체 스크립트입니다. 꽤 더럽지만 D3 10.2에서 컴파일할 수 있도록 작동하고 프로그램을 정리합니다.

나는 이것을 undef로 저장하고 실행 가능하게 만든 다음 내 저장소에 넣었습니다.

그것을 실행하려면:

$ undef NSH > NSH.D3


이렇게 하면 모든 ifdef가 제거되고 정의를 기반으로 하는 NSH 파일이 제공되며 관련 코드 블록만 유지됩니다.

나는 위에서 찾은 C 버전이 비슷한 방식으로 작동하고 아마도 훨씬 더 잘 처리할 것이라고 생각하지만 이것을 작성하는 것은 약간 재미있는 우회로였습니다.

좋은 웹페이지 즐겨찾기