2014-07-24 11 views
0

parsing 파섹에서 사용자의 도움이 필요하다고 바보 같은 상황이 있습니다.parsec의 단일 인용 문자열에서 단일 qoute char 구문 분석

필자는 |/|로 분리 된 strong/char의 시퀀스를 구문 분석해야합니다. 문자. B | | 'C'|는 ''문자열의 내부하지 않는 한 허용되지 않습니다

[a,b,c,abcd] 

공간으로 전환해야한다 'ABCD'

그래서, 우리는있을 수 있습니다. 지금, 내 순진한 시도에서, 나는 a'a와 같은 문자열을 'a'bb'로 파싱 할 수 있지만 aa | b'b는 [aa, b'b]로 변환 할 수없는 상황을 갖게되었습니다. .

이제 파서에게 다음과 같이 '멈춤'을 고려해 보라고 알려주려면 어떻게해야합니까? 또는 공백? (또는이 부분에 영향을주는 문자를 얻으십시오). 입력은 사용자 생성이므로 문자에 의존 할 수 없습니다.

+2

''b'b''을 (를) 구문 분석하려고하고 있지만'singleQuotedChar'에서 작은 따옴표 만 쌍으로 표시되도록 요구합니다. ''b'b'''b'b''''''''b'b'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''b'b''를 파싱 할 수있게하려면 singleQuotedChar의 정의를 변경해야합니다. – rampion

+0

파서는 중간에 'a'''b'b'를 유지해야한다는 것을 어떻게 알 수 있습니까? 나는 네가하고 싶은 것을 이해하려고 고심하고있다. 브라켓 팅 (bracketing chracter)과 같습니까? 그렇다면 왜 그렇습니까? (가능한 대답 : 이것은 공백이 다른 것을 의미하는 큰 입력의 일부입니다.) – AndrewC

+0

다음과 같은 생각이 들었습니다. 문자열은 일련의 문자 (또는 숫자), 아포스트로피 및 아포스트로피로 묶은 공백 또는 글자 (숫자)와 아포스트로피 (아포스트로피)는 아포스트로피로 묶지 않습니다. 문자열은 수직 막대로 보간됩니다. – AndrewC

답변

1

따옴표로 묶인 문자열의 중간에 인용 부호를 허용하는 것은 읽기가 매우 어렵다는 것을 알아 두십시오. 그러나이 구문을 해석 할 수 있어야한다고 생각합니다.

quotedLabel = do -- reads the first quote. 
    whiteSpace 
    char '\'' 
    quotedLabel2 

quotedLabel2 = do -- reads the string and the finishing quote. 
    lab <- many singleQuotedChar 
    try (do more <- quotedLabel3 
      return $ lttrace "quotedLabel2" (lab ++ more)) 
    <|> (do char '\'' 
      return $ lttrace "quotedLabel2" lab) 


quotedLabel3 = do -- handle middle quotes 
    char '\'' 
    lookAhead $ noneOf ['|'] 
    ret <- quotedLabel2 
    return $ lttrace "quotedLabel3" $ "'" ++ ret 
+0

안녕하세요. 어쩌면 나는 바보 같지만 'lttrace'가 정의되지 않아서 위의 코드를 컴파일하는 중 오류가 발생합니다. 어디서 구할 수 있니? –

+0

죄송합니다. 모든 'lttrace x y'를 y로 바꿉니다. – tohava