카테고리 없음

[c#] 소스 코드를 분석하기위한 정규식

행복을전해요 2021. 1. 7. 16:08

이를 수행하는 일반적인 방법은 프로그램

AST

를 가져온 다음 필요한 변수 선언을 검색하는 것입니다. 제안 된 문법은 그러한 AST를 생성하는 좋은 방법입니다.

그러나

프로그램을 즉시 분석해야하는 경우 코드에 구문 분석 오류가있을 수 있으므로이 옵션을 사용할 수 없습니다. 이 경우에 나는 당신의 고통을 느낍니다 ...유일한 옵션은 소스 코드를 구문 분석하는 것이며 정규 표현식이 약간 도움이 될 수 있습니다.

먼저 다음

과 유사한 정규식으로 시작합니다.

(double|long|string|bool|object)\s*(\[\s*\])?\s+(YOUR_VARIABLE_TOKEN)

obs : YOUR_VARIABLE_TOKEN은 변수가 각 언어에 대해 어떻게 구성 될 수 있는지에 대한 강력하고 정의 된 규칙을 가지고 있기 때문에 누락되었습니다.이 정규식을 테스트하지 않았고 확실히 완벽하지 않습니다. 단지 당신에게 아이디어를주기 위해서였습니다.

둘째

, 특정 예외 사례로 이러한 일치를 확인해야합니다. 예를 들면 :

  1. 선언은 String 리터럴 내부에있을 수 있습니다. "bool a;"
  2. 선언은 주석 안에있을 수 있습니다. /* bool a; */

또한 이것은 매우 이상한 요청이 아닙니다. Eclipse는 들여 쓰기와 같은 경우에도 이러한 종류의 평가를 수행합니다.그러나 이것은 특히 그러한 예외 사례를 찾는 쉬운 작업이 아닙니다. 행운을 빕니다.-------------------
특히 문자열 구조를 지원하므로 정규 표현식으로는 불가능하지는 않지만하려는 작업은 매우 어렵습니다. 이렇게하면 어떻게 되나요?

a = 'b = 3;';

즉,이 경우 정규식이 작동하려면 문자열을 이스케이프해야합니다.의미있는 분석을 수행하려면 먼저 코드의 적절한 구문 분석을 수행해야합니다.-------------------
나는 또한 정규 표현식이 이것에 적합하다는 것을 의심합니다.Kragen이 시연했듯이 정규식이 일부 소스 코드와 일치하지만 해당 소스 코드가 나타나는 컨텍스트를 무시하는 경우가 있습니다. 이로 인해 오류가 발생할 수 있습니다. Kragen이 보여준 것과 같은 경우에 대해 더 똑똑한 정규 표현식을 작성하는 것이 가능할

수도

있지만 , 가능한 여러 컨텍스트를 고려해야하므로 매우 복잡해지고 읽기 / 유지 관리 / 이해가 어려워집니다.파서 생성기 (예 : Yacc 또는 Bison)를 사용하여 파서를 작성하는 것을 선호합니다. 그러나 소스 코드의 언어에 따라 매우 까다로울 수도 있습니다.-------------------

정확히 무엇을 찾을까요?

리터럴 (상수) 만 찾거나 전체 선언을 찾아야합니까? 표현식을 사용하여 리터럴을 찾는 것은 괜찮지 만 전체 코드를 구문 분석하는 것은 조금 더 복잡합니다.

문법에 대한 기회를주세요

모든 코드를 파싱해야한다면 ... 문법 분석기를 아십니까? 내가 '언어 이론'을 공부할 때 우리는 코드 구문 분석을 위해 문법을 사용했습니다. 토큰 (상수, 예약어, 기호 등)에 대한 정규식을 사용하여 기본 분석기를 정의하고 모든 구조에 대해 문법 분석기를 사용할 수 있습니다.Java 옵션은

JavaCC

입니다. .Net 옵션이 있어야합니다.기본적으로 문법 분석기는 복잡한 구조를 구문 분석 할 수 있습니다 ( '메모리'포함). 유한 상태 자동 장치가 정규식과 동일하면 스택이있는 FSA (메모리)는 문법과 동일합니다. 더 많은 처리 능력이 있습니다.-------------------
이것이 .NET이라는 점을 감안할 때 CodeDOM을 사용하여 올바르게 구문 분석 할 수 있습니다.기존

C # CodeDOM 공급자

를 사용하여

Parse 메서드

를 사용하여 소스 코드의 구조화 된 표현을 가져온 다음 트래버스합니다. 이를 통해 거의 모든 .NET 언어에서 작동하는 솔루션을 만들 수 있습니다.컴파일 전에 수행해야한다고 말했지만 임시 메모리 내 컴파일을 사용할 수 있으며 그런 다음 리플렉션을 사용하여 작업 할 수 있습니다. CodeDOM 제공 업체도 도움을 드릴 수 있습니다.-------------------
정규식을 사용하지 마십시오. 당신이하고있는 것은 유형 추론이고, 나는 당신이 학교를 위해 그것을하고 있다고 생각합니다. 그들은 논리 통일과 같은 다른 방법을 배우기를 원할 것입니다.당신은 항상 분명히 다른 모든 유형에 의존하고 있습니다. 부울에 0 또는 1이 할당되면 어떻게됩니까? 정규식은 입력을 줄이는 데 좋지 않습니다. 프로그램은 기껏해야 각 유형의 식별자 목록을 생성합니다. 더 나은 접근 방식이 있습니다.상용 환경에있는 경우 솔루션은 완전히 확장 할 수없고 유지 관리 할 수없고 신뢰할 수 없으며 구현 속도가 느릴 것입니다. 이는 자신의 입장에서 볼 때 강력한 적합하지 않습니다.숙제 만하는 것이 아니라면이 언어에 대한 파서에 액세스 할 수 있어야합니다. 그렇지 않은 경우 Bison과 같은 파서 생성기로 시작해야합니다.숙제를하고 있다면 책을 읽는 것이 좋습니다.


편집 :

Bison : vP로 무엇을해야하는지 말하는 것을 잊었습니다. 각 변수에 대한 데이터 구조가 있습니다. 가능한 유형 세트를 포함해야합니다. 말,

unsigned int

하나의 비트가 각 유형을 대표로,

enum type_bits { double_bit = 1, long_bit = 2, string_bit = 4, … };

. 모든 비트를 1로 설정하여 시작하십시오.

type_map = (type_bits) -1;

. 각 작업이 발생할 때마다 호환되지 않는 비트를 가리십시오. 완료되면 몇 가지 비트가 설정됩니다. 둘 이상의 우선 순위 규칙을 적용하고없는 경우 오류를 생성합니다.-------------------
유용하다고 생각되는 몇 가지 아이디어가있을 수있는 모노 프로젝트 C # 컴파일러의 소스 코드를 살펴 보았습니까?svn co svn : //anonsvn.mono-project.com/source/trunk/mcs

출처
https://stackoverflow.com/questions/2005889