2015-01-06 5 views
1

저는 사용자가 C++로 작성된 알고리즘을 검증하도록 정의한 프로그램의 공식 검증 소프트웨어로 작업하고 있습니다. 주제의 세부 사항에 지나치게 집중하지 않고 가능한 한 명확하게 표현하려고 노력할 것입니다.C++ 문 토큰 화

사용자가 양식의 뭔가를 입력하는 경우 :

int foo ([arg1,...,argN]) { 
    if (T_CONDITION) { 
     T_EXEC; 
    } 
    else { 
     T_EXEC'; 
    } 
} 

가 그럼 난 T_CONDITION을하고 싶지을 모두 T_EXECT_EXEC', T_CONDITION 전체 상태이며 T_EXEC은 문장 그있는 형태 Parts = [ COND => T_CONDITION, EXEC => [ T_EXEC, T_EXEC' ] ]에 조건이 참이면 프로그램이 실행되고 프로그램이 else 문으로 들어가면 T_EXEC'이 실행됩니다. 나는 이것을 "토큰 화기"라고하고 파서의 기능이라고 생각하지만, 나는 확실하지 않다.. 문제는 내가 파서에 대해 아무것도 모른다는 것이다. 문제는 조건과 실행이 어디서 시작되고 끝나는 지 모르겠다. 그렇다면 문자열 연산을 처리 할 수 ​​없다.

일단 내가 T_CONDITION을 갖게되면, 몇 가지 원자 논리 수식을 얻으려면 그런 식으로 분해해야합니다. 뭔가 같은 :

T_CONDITION = ((A OR N) OR (B AND C) OR (D AND (E OR F))) 

가 그럼 난 CONDITION_PARTS = [ [ A ], [ N ], [ B , C ], [ D, [ [ E ], [ F ] ] ] ] 을 얻으려면 이것이다 : 나는 A or B를 얻을 수 있다면, 나는 PART = [[A],[B]]이 필요하고 난 다음 PART = [A,B] A and B을 얻을합니다. 그러나 조건의 어느 부분이 각 닫는 괄호에 속하는지 어떻게 알 수 있습니까?

이것이 가능합니까?, 어떤 도구를 사용해야합니까?, 이에 대한 가이드가 있습니까?

+7

[Clang tooling] (http://clang.llvm.org/docs/Tooling.html) 휠을 다시 발명하지 마십시오. – Angew

+0

이것은 오프 사이트 리소스 (오프 토픽)에 대한 요청이 아닙니다. 이것은 도구의 ** category ** 이름이 ** 어떻게 ** 객관적인 답을 가지고 있는지 물어 보는 것입니다. 질문에 이미 잠재적 인 (그러나 틀린) ansswer 인 "tokenizer"가 있기 때문에이 내용을 볼 수 있습니다. – MSalters

답변

4

여기에 갈 수있는 정상적인 방법은 Clang뿐입니다. 그것은 당신이 라이브러리로 호출 할 수있는 C++ 컴파일러입니다. 기존 C++ 렉서, 분석기 및 파서를 사용하여 파일 내용을 검색 할 수 있습니다.

파서 전문가 인 경우에도 미친 사람 만 자신의 C++ 파서를 굴릴 것입니다. Turing Complete입니다.

+0

글쎄, [so is'mov'] (http://www.cl.cam.ac.uk/~sd601/papers/mov.pdf). :) –

1

파서가 얼마나 필요한지에 따라 다릅니다. 전체 C++ 구문을 처리하려면 g ++ 및 기타 오픈 소스 프론트 엔드의 렉서를 살펴 봐야합니다.

비교적 간단한 구문을 보장 할 수 있으면 자신의 파서를 롤링 할 수 있습니다.

그러나 C++ 구문 분석은 매우 어렵습니다. 템플릿 정의, #define 구조체 등 ....에 대해 알아야 할 모든 사항에 대해 생각해보십시오. 따라서 공식적인 검증을 수행하려는 경우 일반적인 경우라면, 기존의 C++ 렉서/파서를 직접 작성하는 대신에 훨씬 더 잘 적응할 수 있습니다.

+0

나를 위해 훌륭한 파서를 알고 있습니까? – Tomirammstein

+0

@Tomirammstein : Angew의 의견보기 – Rufflewind