2017-03-01 5 views
-1

를 무시 {}정규식 나는 다음과 같은 무언가를 분석 렉스 프로그램 ... <pre><code>function myFunc { if a = b { print "Cool" } } </code></pre> <p></p>이 구체적으로 먼저 모든 것을 골라하는 정규식을 만들 플렉스 사용 가능 건물입니다 중복 중괄호

그래서 내가 얻을 것이다

{ if a = b { print "Cool" } } 

대신

{ if a = b { print "Cool" } 

현재 내 플렉스 파일에 나는이 정규식이 {[^ \ 0] *} 당신이 뭘 하려는지와

+1

일치하는 중괄호는 'bison'과 (과) 일치해야하지만'flex '가 아니어야합니다. – tsh

답변

0

하나의 문제 (정규식은 기본적으로 욕심이 있다는 것을를 변경하는 몇 가지 트릭을 할 수있는, 하지만 여전히 문제가있을 것입니다.) 여러 함수가있는 파일에서이 작업을 실행하면 의도 한 것보다 더 많이 일치하게됩니다. 이유는 대부분의 프로그래밍 언어가 Chomsky 계층 구조에있는 Type 1 grammars이거나 상황에 맞는 문법이며 RegEx는 유형 2 (문맥없는 문법)이기 때문입니다. 많은 작업없이 나중을 사용하여 전자를 직접 파싱하는 것은 근본적으로 불가능합니다. 그것에 대한 자세한 설명은 ... 길다. 그러나 상황에 민감한 문법에서는 주어진 요소의 의미가 입력에 따라 달라질 수 있습니다. 문맥 자유 문법에서는 모든 요소가 정확히 한 가지 의미를 갖습니다. 귀하의 경우, '}'과 일치하지 않으려면 해당 }{과 일치시키고 싶습니다. 지금까지 보았던 {}의 수를 계산해야합니다.

바퀴, 쟁기, 불, 철강 및 모든 전기 방법을 다시 발명하지 않고도 코드 파싱을 실제로하고 싶다면 GitHub에서 AnTLR을 확인하는 것이 좋습니다. AnTLR을 사용하면 구문 분석하려는 언어에 대한 문법 (아직없는 경우)을 만들고 Parse Tree 형태로 파싱 된 소스 코드를 제공 할 수 있습니다. 파스 트리는 매우 사용하기 쉽고 AnTLR은 상상할 수있는 거의 모든 언어에 대해 이미 문법을 가지고 있으며 plugins for several languages입니다.

이외에, 내가 사용하는 온라인 정규식 테스터와 메모장 ++ 모두가 샘플 코드와 일치했습니다. RegEx {.*}을 사용해보십시오. 모두 일치하는 RegEx입니다.