2015-01-25 3 views
2

나는 포함 된 주석이 허용되는 언어를 이해할 수있는 프로그램을 작성하려고합니다. 예를 들면 :구문 분석 할 때 alex와 함께 monadUserState를 사용하려면 무엇을 추가해야합니까?

/* Here's a comment 
    /* This comment is further embedded */ second comment is closed 
Must close first comment */ 

이 주석으로 인식되어야한다 (그것은 단지 이전에 개방 한 코멘트를 보았다하지 않는 한 같은 최초의 *에서 멈추지/그것은 본다).

C에서 수정하기가 쉬운 문제 일 수 있습니다. 주석을 보았을 때 증가하는 카운터를 가질 수 있으며, 주석을 닫을 때 카운터가 감소합니다. 카운터가 0이면 "코드 섹션"에 들어갑니다.

그러나 하스켈에 상태가 없으면 조금 더 어려워집니다.

필자는이 정확한 파싱 유형에 대한 상태를 추적 할 수있는 monadUserState를 읽었습니다. 나는 그것이 내가 직접 "기본"으로 변경 주목해야한다

templates\wrappers.hs:213:16: Not in scope: `alexEOF` 

오류를 제공 컴파일 할 때 그러나, 나는 옆 tutorial page on alex.

에서 그것에 매우 독서 자료를 찾을 수 없습니다 "monadUserState"래퍼 내 코드를 변경하지 않고 (나는 그것을 사용하기 위해 무엇을 추가 해야할지 모르겠다). 이것이 사용자 코드에서 초기화해야한다고 말한다 :

data AlexState = AlexState { 
     alex_pos :: !AlexPosn, -- position at current input location 
     alex_inp :: String,  -- the current input 
     alex_chr :: !Char,  -- the character before the input 
     alex_bytes :: [Byte], -- rest of the bytes for the current char 
     alex_scd :: !Int,  -- the current startcode 
     alex_ust :: AlexUserState -- AlexUserState will be defined in the  user program 
    } 

나는 lexxing 멍청한 놈의 비트와 나는 전혀 나는 그것이 적어도 컴파일하기 위해 여기에 추가해야 모르겠어요 .. 그때 나는 그 물건의 논리에 대해 걱정할 수 있습니다.

답변

2

업데이트 : "tiger.x"는 알렉스 GitHub의의의 repo에서 (link)는 monadUserState 래퍼를 사용하여 포함 된 주석을 추적하는 방법의 예를 포함 http://lpaste.net/119212

파일 : 여기에 해당 예를 들어 작업.

불행히도이 예제는 컴파일되지 않지만 거기에있는 아이디어는 작동해야합니다.

기본적으로,이 선이 포함 된 실시합니다 주석 처리 :

data Tokens = ... | EOF 

alexEOF을 같이 정의 :

alexEOF에 관해서는
<0>    "/*"   { enterNewComment `andBegin` state_comment } 
<state_comment> "/*"   { embedComment } 
<state_comment> "*/"   { unembedComment } 
<state_comment> .   ; 
<state_comment> \n   { skip } 

는 생각은 토큰 데이터 유형에 EOF 토큰을 추가하는 것입니다 :

alexEOF = return EOF 

tests/tokens_monadUserStat 파일보기 e_bytestring.x 예를 들어 알렉스 레포에서.

+0

답장을 보내 주셔서 감사합니다. 이 응답에 넣은 시간과 노력에 감사드립니다. 그것은 나에게 많은 도움이되었습니다. – Aserian