2015-02-05 5 views
0

두 중괄호 사이에 코드를 가져 오려고하지만 여전히 중첩에주의하십시오. 내가 입력으로 다음과 같은 것을 가지고 말 :중첩을 존중하면서 두 중괄호 사이의 코드를 찾으려면 어떻게해야합니까?

while (true) {     [A] 
    dothis(); 
    if (whattype() == "A") {  [B] 
     doA(); 
     if (other() == "dog") { [C] 
      doB(); 
     }       [D] 
    }        [E] 
    if (other() == "cat") {  [F] 
     doZ(); 
    }        [G] 
}         [H] 

를 그리고 각각의 중첩 레이어 재귀 루프를 원하는 :

while 
- if 
    - if 
- if 

는 현재 함수는 문자열을 취 탐욕 코드를 찾기 위해 정규식 (\{([\s\S]*)\})를 사용 첫 번째와 마지막 중괄호 사이에 입력하고 문자열에 더 이상 중괄호가 없을 때까지 내용에 다시 입력합니다.

문제는 정규식이 서로 인접한 코드 블록에 대해 작동하지 않는다는 것입니다. 정규 표현식은 B 사이의 텍스트를 G까지 일치시킵니다. 대신 B에서 시작하여 E에서 중지하고 F에서 G까지 다른 블록으로 이동해야합니다.

편집 : 정규식 이외의 다른 것으로 끝날 수 있습니다. 이것을 처리하는 방법에 대한 제안이 있습니까? 미래의 독자


: 나는 도움이되었다고 무엇

다른 SO 질문에서 this 대답했다.

+3

중괄호/중괄호는 "정규식으로 할 수없는 일"의 전형적인 예 중 하나입니다. – Pointy

+0

@Pointy 다른 것을 사용하게 될지도 모르지만,이 논리를 어떻게 수행 할 것인지에 대한 제안이 있습니까? – aNewStart847

+0

각 줄을 반복하십시오. '{'에 도달하면 변수에 1을 추가하고'}'에 도달하면 var에 1을 더합니다. –

답변

3

이 유형의 문제는 전체 블록을 사용하는 정규식으로는 해결할 수 없습니다.

당신이 설명하는 것은 JavaScript 언어의 완전하고 정확한 토큰 화를 요구합니다. 예를 들어, 괄호 안에 따옴표로 묶인 텍스트가 포함되어 있다고 생각해보십시오. 실제로 더 많은 이익을 볼 수 없다면, 나는 합리적인 시간에 실제로 성공하는 것보다 (스스로 파서가 어떻게 작동하는지 이해하기 위해 놀고있는 것처럼) JS 파서에서 기존 JS를 확실히 살펴 봐야합니다. 예 : http://marijnhaverbeke.nl/blog/acorn.html (Google이 내게 준 첫 번째 결과이며 해당 라이브러리를 사용해 본 적이 없음)를 참조하십시오.

+0

이것은 더 큰 프로젝트의 일부 임에도 불구하고 파서가 작동하는 방법을 배우기 위해이 작업을 수행하고 있습니다. 나는 [jison] (http://zaach.github.io/jison/)을 보았지만, 더 많은 파서를 둘러 볼 것이다. – aNewStart847

+0

훌륭한 언어 파싱은 매우 흥미로운 주제입니다. 사실 내가 가장 좋아하는 과목 중 하나입니다. 그러나 나를 믿어 라. JavaScript 언어는 올바르게 구문 분석 할 수있다. 커스텀 파서를 작성하면 (그리고 최악의 경우, 처음으로)이 작업은 전체 프로젝트 성공 확률을 떨어 뜨릴 수 있습니다. 거기에 관심사를 섞어서는 안됩니다 ... – jwatkins

+0

쪽지에서 파서 작성을 시작하려면 Eclipse의 Xtext를 살펴보아야합니다. Java 기반입니다 (경험이 있는지는 잘 모릅니다). 특히 파서 구성에 대한 사전 지식이 거의없는 사람들에게 매우 흥미로운 사실입니다.a) 단일 통합 워크 플로에서 언어 정의의 모든 측면을 다룰 수 있으며 b) 다양한 샘플 언어를 구현하는 방법에 대한 여러 비디오를 포함하여 언어 개발자 관점에서 잘 문서화되어 있습니다. – jwatkins