2017-05-20 6 views
2

저는 현재 ANTLR4에 C#을위한 전처리기를 구현하려고하고 이에 대한 정보를 찾는 데 많은 어려움을 겪고 있습니다. 내는 C# 프로젝트의 GitHub의 소스를 통해 파고 정말 토큰의 오프셋을 제거하지 않고 ANTLR4에 전처리 레이어 추가

내 목표는 (사전 처리 된 스트림에 의해 그래서 열과 라인의 발생되지 않을 것이다) 토큰 오프셋을 유지하는 것입니다 ... 슬프게도 성공적인되었습니다하지 않았다 약에 대한 예를 설명 : 올바른 문서 날 지점 또는 간단한 예제 솔루션 곳

친절하게 안부를 제공 할 수 있습니다

#define foo(bar) foobar(bar + bar * bar/0.2) 
int smthng = 2; 
smthng += foo(12); //the ; should be at the same spot like the macro was a function 

희망, 마르코

PS 메모 : 나는 코드의 오프셋과 함께 바이올린 것입니다 전에 ANTLR4 이미 전처리 된 스트림을 전달하는 솔루션을 추구하지 않습니다.

답변

0

스트림을 전처리하는 방법에 따라 다릅니다. 모든 선행 처리기 행 (및 #ifdef 등으로 볼 수없는 행)을 줄 바꾸기로 바꾸면 전체 줄 번호가 엉망이되지 않습니다. 사실 나는 심지어 정상적인 구문 분석 실행 (예 : 입력 스트림 이미 이미) 밖에서 전처리 할 것을 권장합니다.

년 전 I wrote a Windows .rc file parser. 이러한 리소스 파일은 C 헤더 파일과 같은 여러 측면에서 사용되므로 전 처리기, 문자열 화 및 charizing 지원 및 몇 가지 추가 작업으로 매크로 처리가 필요합니다. 나는 ANTLR 2.7 (지금 당신이 을 보았습니다.은 오래되었습니다 :-)). 하지만 여전히 전처리 작업을 수행하는 좋은 예라고 생각합니다 (#include 포함).

+0

매크로를 확장 할 때 텍스트 위치가 변경 될 수 있습니다. – X39

1

는 처리기 지시문의 두 가지 전략이 구문 분석이 있습니다

  • 한 단계 처리
  • 2 단계 처리

두 번째 방법은 때문에 때문에 망치고 텍스트 위치의 당신을 위해 적합하지 않습니다 매크로 확장.

첫 번째 방법은 하나의 공통 렉서에서 전 처리기 지시문을 토큰 화하여 정확한 텍스트 위치를 저장할 수 있습니다.

Objective-C grammar 참조 기사 "목표 - C의 구문 분석 전처리 지침"에 One-step Processing 섹션

한 단계 처리 지침과 기본 언어의 토큰의 동시 분석을 포함한다. ANTLR은 유형별로 토큰을 격리하는 채널 시스템을 도입합니다. 예를 들어, 기본 언어 및 숨겨진 토큰 (공백 및 주석)의 토큰. 지시어 토큰은 별도의 명명 된 채널에 추가 할 수 있습니다.

경우에 따라 디렉티브 토큰을 공통 채널에 포함 할 수도 있습니다. 더 편리합니다. 예를 들어 토큰 NS_OPTIONS 및 규칙 enumSpecifier를 참조하십시오

enumSpecifier 
    : 'enum' (identifier? ':' typeName)? (identifier ('{' enumeratorList '}')? | '{' enumeratorList '}') 
    | ('NS_OPTIONS' | 'NS_ENUM') LP typeName ',' identifier RP '{' enumeratorList '}' 
    ; 

또한 간단한 문자열로 처리기 지시문을 구문 분석하고 나중에 분석 할 수 있습니다 DEFINE: '#define' ~[\r\n]*합니다.

Objective-C to Swift 변환기 Swiftify에서 우리는 한 단계 처리 방법을 사용하고 있습니다. 나는 Objective-C 문법을 곧 갱신 할 예정이다.

+0

X39가 내 대답에 대한 유효한 포인트를 제기했습니다. 어떻게 다중 매크로 확장을 처리합니까? 이런 경우 원래 줄 번호를 유지하는 방법을 설명하는 몇 가지 단어를 여기에 추가 할 수 있습니까? –