2011-02-12 2 views
0

파스칼과 같은 함수 선언을 본문으로 파싱하는 방법 (및 가능한이) 정규식은 무엇입니까? 좀 정규 표현식 기능 만 프로토 타입을 (이 댓글이없는 경우에만 작동하므로 해석하기 전에 내가 분명히 댓글) 풀 수 본문으로 파스칼과 같은 함수 선언을 파싱하는 regexp를 작성하는 방법은 무엇입니까?

function\s+(\w+)(\(((((var\s*)?(\w+)(\s*\,+\s*)?)+?\s*\:\s*(\w+)\s*\;?\s*?)\s*)+\))?\s*\:\s*(\w+) 

을 만들었습니다와 나는 그것을 풀 수 있도록 변경하는 방법을 몰라 시체와 기능. 문제는 "begin - end"블록이 많아서 끝나는 기능을 찾기가 어렵습니다.

답변

3

죄송합니다. 잘못된 도구를 사용하고 있습니다. 프로그래밍 언어는 정규 표현식이 단순히 안정적으로 인식 할 수없는 문맥없는 구조를 가지고 있습니다. {() [] } { }과 같이 올바르게 중첩 된 괄호는 적절한 중첩을 확인하는 정규 표현식을 찾을 수없는 컨텍스트 프리 구조의 예제입니다.

이 문제를 해결하려면 정규식을 사용하여 프로그램 코드를 토큰 스트림으로 분해 한 다음 (수동으로 코딩 된) 하향식 파서를 사용하여이 토큰 스트림의 구조를 검사 할 수 있습니다. 이에 대해 배우려면 컴파일러 디자인에 대한 모든 설명서를 참조하십시오. 검사 (토큰으로 깨기)와 구문 분석 (구조 검사)은 항상 첫 번째 장입니다. Wikipedia entry for a top-down parser은 예제를 제공합니다.

+0

컴퓨터 이론의 정규 표현식은 이러한 구문을 지원하지 않습니다. 그러나 많은 RegEx 구현에는 이러한 일치를 지원하는 특별한 기능이 있다고 생각합니다. 균형 잡힌 그룹이라고 불리는 것 같습니다. 개인적으로 나는 여전히 그런 문법을위한 깨끗한 파서를 쓰는 것을 선호한다. – CodesInChaos

+0

@CodeInChaos 많은 RE 구현이 이론적 한계를 넘어서는 것은 당연하지만 RE 이론이 제공하는 성능 보장을 포기해야합니다 (cf. http://swtch.com/~rsc/regexp/regexp1.html 참조).). 예를 들어, Perl은 컨텍스트 프리 구조를 인식하는 구조를 제공합니다. 더 깔끔한 접근법은 파싱과 스캐닝을 통합하는 루아의 LPeg 프레임 워크입니다. 기능적 언어는 파서 결합자를 사용하여 동일한 효과를 낼 수 있습니다. 이 같은 것을 사용할 수 없다면, 파서를 명시 적으로 사용하는 것이 좋습니다. –

관련 문제