2011-07-05 3 views
2

안녕 얘들 아 나는 사용자 지정 스크립팅 언어로 작업하고 있으며 C#에서이 언어에 대해 일종의 IDE를 만들고 있습니다. 언어의 기능은 다음과 같이 정의된다 : 나는 정규식을 통해 모든 기능의 목록을 얻을 수있는 가장 좋은 방법을 알아 내기 위해 노력했습니다 및 목록을 얻을 수있는 작업 방법을 찾을 수 없습니다정규식으로 함수를 찾는 가장 좋은 방법은 무엇입니까?

yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

정의 된 모든 기능들. 누군가가 더 나은 방법이나 정규식으로 그것을 할 수있는 방법을 말해 줄래? 고마워요!

편집 : C#에서이 작업이 가능합니까? 당신은 'DEF'와 같은 예약 된 키워드를 추가하여 구문을 변경 한 경우가 훨씬 쉬울 것 %[a-z_0-9^[^]*]++ [a-z_0-9*^[^]]+[ ^t]++[a-z_0-9*^[^]]+[ ^t]++^([*a-z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-z_0-9./(!]++)[~;]

+0

중첩 된 패턴과 일치시키는 데 정규식을 사용할 수 있습니까? (http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) – jtbandes

+1

당신이 당신의 언어에 대해 심각하다면 정규 표현식이 아닌 렉서/파서 쌍을 사용해야합니다. –

+0

이 작업을 수행 할 수 있습니다. 제안 해 주셔서 감사합니다. – user556396

답변

4

이런 식으로 뭔가가 작동하지 않을 수 있습니다 :

Regex.Matches(source,@"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{").Cast<Match>() 
    .Select (m => m.Groups[1].Captures[0].Value).ToArray() 

기본적으로, 그 정규식 옵션 공백 뒤에 영숫자 문자의 그룹을 찾고은 여는 괄호를 따라 뒤에는 0 개 이상의 괄호가 붙지 않고 뒤에 작은 괄호가오고 그 다음에 선택적 공백이오고 열린 중괄호가옵니다.

그런 다음 여기에서 시작 부분 만 추출하고 목록을 만듭니다. 언어가 그렇지 않으면 닫는 괄호 앞에 열린 대괄호가 오는 것을 허용하지 않는다고 가정하면 위의 코드가 작동해야합니다. 그렇지 않으면 세부 사항이 더 필요합니다.

+0

위의 코드는 주석 처리 된 함수를 catch 할 수 있으며 문자열에서 함수 정의와 비슷한 내용을 catch합니다. 가장 좋은 방법은 파서를 사용하는 것입니다. 문제의 언어에 대한 공식적인 문서가있는 경우에는 특히 그렇게하기가 어렵지 않습니다. 명세에 BNF 또는 유사한 문서의 문법이 포함되어 있다면, 그 작업은 매우 직설적 인 번역이됩니다. –

0

, 그래서 사용자의 선언이 될 :

def yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

그런 다음 당신이 def [a-zA-Z0-9]+ 같은 간단한 정규식을 사용할 수 있습니다. 그냥 함수 이름의 목록을 원하는 경우

+0

나도 이것을 생각하고 있었다. 그게 내가 힘든 시간을 보내고 있었던 이유 다. 불행히도 스크립팅 언어를 변경할 수있는 능력이 없습니다. – user556396

+0

또한 간단한 정규 표현식이 작동하지 않습니다 (문자열 리터럴에서 "def ..."에 대해 생각하십시오). 용 도서 (http://en.wikipedia.org/wiki/Compilers:_Principles,Techniques,__Tools)는이 주제에 대한 권위입니다. – Hut8

관련 문제