Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 공급자에서 실행할 수 있는 cphs 명령입니다.
프로그램:
이름
cpphs - Haskell을 위한 자유화된 cpp와 유사한 전처리기
개요
cphs [파일 이름|OPTION] ...
기술
cphs 의 자유화된 재구현이다. CPP (1) C 전처리기, in 및 for
하스켈.
cpp를 다시 구현하는 이유는 무엇입니까? 옳고 그름, C 전처리기는 Haskell에서 널리 사용됩니다.
소스 코드. 다른 컴파일러에 대한 조건부 컴파일을 가능하게 합니다.
동일한 컴파일러의 버전 및 다른 OS 플랫폼. 가끔 사용하기도 합니다
특정 형식의 플랫폼별 세부 사항을 활성화할 수 있는 매크로 언어의 경우-
인스턴스 정의 및 FFI의 지루한 상용구 생성과 같은 채우기
선언. 그러나 명백한 미학 외에도 cpp에는 두 가지 문제가 있습니다.
그들 :
일부 Haskell 시스템, 특히 Windows의 Hugs에서는 진정한 cpp를 사용할 수 없습니다.
태만.
다른 Haskell 시스템의 경우에도 gcc 3.x 시리즈에서 제공하는 공통 cpp
Haskell의 구문과 호환되지 않는 방식으로 미묘하게 변경되고 있습니다. 있다
예를 들어 문자열 간격 및 프라임 문자와 같은 문제가 항상 발생했습니다.
식별자. 이러한 문제는 더욱 악화될 뿐입니다.
따라서 cpp에 대한 대안을 제공하려는 시도가 옳은 것 같았습니다.
하스켈, 그리고 컴파일러와 함께 배포될 수 있도록 하스켈로 작성되었습니다.
cphs 기능이 거의 완벽하며 -전통적인 cpp 스타일.
두 가지 모드가 있습니다.
조건부 컴파일 전용(--노마크로),
전체 매크로 확장(기본값).
In --노마크로 모드, cphs 조건부 컴파일 작업만 수행합니다. #포함'에스,
#만약'모래 #ifdef는 텍스트 대체 정의에 따라 처리됩니다(둘 다 명령-
라인 및 내부), 그러나 매개변수화된 매크로 확장은 수행되지 않습니다. 전부
호환성 모드(기본값), 텍스트 대체 및 매크로 확장도
비 cpp 텍스트의 나머지 본문에서 처리됩니다.
작업 기능:
#ifdef 간단한 조건부 컴파일
#만약 defined(), &&, ||, == 등의 전체 부울 언어
#엘리프 연결된 조건문
#밝히다
인라인 정의(텍스트 대체 및 매크로)
#언데프 인라인 정의 취소
#포함
파일 포함
#선 줄 번호 지시어
\n 모든 # 지시문 내 줄 연속
/ ** / 매크로 정의 내의 토큰 연결
## ANSI 스타일 토큰 연결
# ANSI 스타일 토큰 문자열화
__파일__
DIY 오류 메시지에 대한 특수 텍스트 교체
__선__
DIY 오류 메시지에 대한 특수 텍스트 교체
__데이트__
특수 텍스트 교체
__시각__
특수 텍스트 교체
매크로 확장은 재귀적입니다. 매크로 이름을 재정의해도 경고가 생성되지 않습니다.
매크로는 다음을 사용하여 명령줄에서 정의할 수 있습니다. -D 텍스트 대체와 같습니다. 매크로
이름은 Haskell 식별자로 허용됩니다. 예를 들어 프라임 ` 및 백틱 ´
문자는 C보다 약간 느슨하지만 여전히 연산자를 포함하지 않을 수 있습니다.
기호.
출력의 라인 번호 매기기는 이후 프로세서가 제공할 수 있도록 보존됩니다.
의미 있는 오류 메시지. 파일이 #포함'디, cphs 삽입 #선 지시문
같은 이유. 줄이 계속되는 경우에도 번호 매기기가 정확해야 합니다.
원하지 않으면 #선 최종 출력의 지시문을 사용하려면 --놀린 옵션을 선택합니다.
cpp 지시문의 모든 구문 오류는 stderr에 메시지를 제공하고 프로그램을 중지합니다.
#include 파일을 찾지 못하면 stderr에 대한 경고가 생성되지만 처리는 계속됩니다.
명령줄에서 원하는 수의 파일 이름을 지정할 수 있습니다. 결과는 다음에 연결됩니다.
표준 출력.
-DSYM 텍스트 대체 정의(기본값은 1)
-Dsym=파
특정 값으로 텍스트 대체 정의
-I통로 #include의 검색 경로에 디렉토리 추가
-O파일 출력할 파일 지정(기본값은 stdout)
--노마크로
#ifdef 및 #include만 처리합니다.
매크로를 확장하지 마십시오
--놀린
출력에서 #line 배설물 제거
--조각
외부에서도 C 스타일 주석을 공백으로 변환
cpp 지시문
--해시
ANSI # 문자열화 연산자를 인식하고 ##
토큰 연결, 매크로 내
--본문 입력을 Haskell 코드가 아닌 일반 텍스트로 처리
--형세
매크로 확장 내 줄 바꿈 유지
--꺼짐
문맹 스타일 주석 제거
--번역
cpphs의 버전 번호 보고 및 중지
기본적으로 정의된 텍스트 교체는 없습니다. (일반 cpp에는 일반적으로 정의가 있습니다.
기계, OS 등. 원하는 경우 cpphs 소스 코드에 쉽게 추가할 수 있습니다.)
검색 경로는 다음 순서대로 검색됩니다. -I 옵션을 제외하고는
호출 파일 다음에 현재 디렉토리가 항상 먼저 검색됩니다. 다시 말하지만, 없다
기본 검색 경로(또한 쉽게 변경할 수 있음).
차이점 FROM CPP
일반적으로 cpphs는 -전통적인 ANSI C가 아닌 동작이며
표준 cpp와의 주요 차이점은 다음과 같습니다.
일반
The # 모든 cpp 지시문을 도입하는 것은 줄의 첫 번째 열에 있어야 합니다(반면에
ANSI는 문자 앞에 공백을 허용합니다. # ).
생성 #선 n "파일 이름" 구문이 아니라 # n "파일 이름" 변종.
C 주석은 cpp 지시문 내에서만 제거됩니다. 그들은 다른 것에서 벗겨지지 않습니다
텍스트. 예를 들어 Haskell에서 다음은 모두 유효한 연산자입니다.
기호 : /* */ * / * 그러나 다음을 사용하여 C-댓글 제거를 켤 수 있습니다. --조각 옵션을 선택합니다.
매크로 언어
수락 / ** / 매크로 정의에서 토큰 붙여넣기용. 하지만, /* */ (어떤 텍스트로
열기/닫기 주석 사이) 공백을 삽입합니다.
ANSI ## 토큰 붙여넣기 연산자는 --해시 깃발. 이것은 피하는 것입니다
동일한 이름의 유효한 Haskell 연산자를 잘못 해석합니다.
문자열 내부에서도 매크로 형식 매개변수를 실제 매개변수로 바꿉니다(double 또는 single
인용). 이것은 ANSI에서 지원되지 않는 전통적인 동작입니다.
인식 # 문자열화 연산자를 사용하는 경우에만 매크로 정의에서 --해시
옵션. (ANSI 추가이며 인용 문자열화(위)가 있기 때문에 필요합니다.
ANSI에서 금지합니다.)
텍스트 교체 정의 내에서 공백을 정확하게 유지합니다(모듈로 개행).
그러나 선행 및 후행 공백은 제거됩니다.
매크로 정의(및 후행) 내에서 공백을 정확하게 유지합니다(modulo
newlines), 그러나 선행 공백은 제거됩니다.
매크로 호출 인수 내의 공백을 정확하게 유지하지만(개행 포함) 선행
후행 공백이 제거됩니다.
와 더불어 --형세 옵션, 텍스트 교체 또는 매크로 정의의 줄 연속
매크로 호출에서 줄 바꿈으로 보존됩니다. (레이아웃에 민감한 코드에 유용
하스켈.)
onworks.net 서비스를 사용하여 온라인에서 cphs 사용