2012-07-04 4 views
3

나는 C++ 프로젝트의 라인 카운터에 대한 연구를하고 있었고, 나는 그들이 사용하는 알고리즘에 관심이 많다. 누구든지 그러한 알고리즘의 구현을 어디에서 볼 수 있는지 알고 있습니까? 라인 카운터에 의해, 당신은 라인을 계산 프로그램을 의미하는 경우코드 라인을 카운트

+9

실례지만 내 카운트는 무엇입니까? –

+0

회선 계산이란 무엇입니까? – Pacane

+0

간략하게 설명해주세요. –

답변

3

음, 다음 알고리즘은 매우 간단하다 : 단지 코드 '\n'의 수를 계산합니다. 반면, C++ 문장을 계산하거나 다른 메트릭을 계산하는 프로그램을 의미하는 경우 ... 100 % 정확하지는 않지만 '}'및 '을 계산하여 꽤 좋은 결과를 얻었습니다. ' (주석 및 문자열 및 문자 리터럴을 무시하고, 코스). 더 정확한 것은 실제로는 실제 C++ 구문 분석이 필요합니다.

+0

나는 C++ 파일에서 물리적 인 코드 라인을 계산할 알고리즘을 의미했다. 어리 석다 '와'; ' 가장 단순한 경우에는 너무 원시적입니다. – smallB

+0

@smallB 측정하려는 대상에 따라 다릅니다. 실제로 라인 일 경우'wc -l'을 사용하십시오.그리고 알고리즘은 실제로' '\ n ";을 계산하는 것입니다. '}'와 ';'를 세는 것이 훨씬 더 원시적입니다. (이것은 프로그램에서 문장의 수에 대한 좋은 1 차 근사값을 제공한다). –

+0

# Kanes 코드의 줄을 세는 것은 '\ n'을 세는 것과 아무런 관련이 없습니다. 코멘트는 어떻습니까? 코멘트는 줄이 아니지만 '\ n', ';'을 구문 분석하면 계산됩니다. 또는 '}'. C++ 파일의 코드 줄 수를 계산할 수있는 알고리즘에 관심이 있습니다. – smallB

14

코드 카운터의 무료 오픈 소스 소스 라인 인 cloc이 있습니다. C++를 포함한 많은 언어를 지원합니다. 나는 개인적으로 그것을 사용하여 프로젝트의 행 수를 얻는다.

sourceforge 페이지에서 다운로드 할 수있는 perl 소스 코드를 찾을 수 있습니다.

2

줄 번호를 계산하기 위해 실제로 코드를 구문 분석 할 필요는 없습니다. 토큰 화하기에 충분합니다.

int lastLine = -1; 
int lines = 0; 
for each token { 
    if (isCode(token) && lastLine != token.line) { 
     ++lines; 
     lastLine = token.line; 
    } 
} 

당신이 tokenisation 동안 수집해야하는 유일한 정보는 다음과 같습니다 :

  • 그것이 토큰의 유형 (연산자, 식별자, 주석처럼

    알고리즘은 볼 수 있었다 ...) "코드 토큰이 아닌 것"(주석)과 "코드 토큰"(다른 것) 만 구별하면되므로 여기 실제로 매우 정확하게 할 필요가 없습니다.

  • 파일의 어느 줄에 토큰 발생.

토큰 화하는 방법은 알아내는 것이지만, 간단한 경우를 위해 토큰 라이저를 직접 작성하는 것은 어렵지 않습니다. flex을 사용할 수는 있지만 중복 될 수 있습니다.


편집

내가 언급 한 "tokenisation"내가 빨리 당신을 위해 그것을 설명하자

Tokenisation 컴파일의 첫 번째 단계입니다. 토큰 화의 입력은 텍스트 (멀티 라인 프로그램)이며 출력은 "토큰 (tokens)"의 시퀀스입니다. 예를 들어, 다음 프로그램 :

PreprocessorDirective("include") 
StringLiteral("something.h") 
PreprocessorDirectiveEnd 
MultiLineComment(...) 
Keyword(INT) 
Identifier("main") 
Symbol(LeftParen) 
Symbol(RightParen) 
Symbol(LeftBrace) 
Keyword(RETURN) 
Identifier("something") 
Symbol(LeftParen) 
NumericLiteral(2) 
Operator(PLUS) 
NumericLiteral(3) 
Symbol(RightParen) 
Symbol(Semicolon) 
SingleLineComment(" this is equal to 5") 
Symbol(RightBrace) 

기타 등등 :

#include "something.h" 

/* 
This is my program. 
It is quite useless. 
*/ 
int main() { 
    return something(2+3); // this is equal to 5 
} 

처럼 볼 수 있었다.

토큰 유형에 따라 유형, 기호 유형, 연산자 유형, 식별자 텍스트 또는 토큰이 발견 된 행 번호와 같은 임의의 메타 데이터가 첨부 될 수 있습니다.

이러한 토큰 스트림은 구문 분석 트리를 작성하기 위해 이러한 토큰과 관련하여 작성된 문법 작성 규칙을 사용하는 파서로 보내집니다.

완벽한 구문 분석 트리를 제공하는 전체 구문 분석기를 사용하는 것은 어렵습니다. 특히 C++에 관해서는 어려운 문제입니다. 그러나 토큰 화 (lexing) 또는 "어휘 분석 (lexical analysis)"은 더 쉽습니다. 당신이 많은 세부 사항에 대해 걱정하지 않을 때, Finite state machine을 사용하여 직접 토큰 화를 작성할 수 있어야합니다.

실제로 출력을 사용하여 코드 줄 (예 : "코드"토큰, 즉 주석을 제외한 모든 토큰이 시작되는 줄)을 계산하는 방법은 앞에서 설명한 알고리즘을 참조하십시오.

+0

이것은 단순한 경우 이외에는 작동하지 않습니다. 다중 행간 주석은 어떻습니까? 내가 필요한 것은 5 분 만에 누군가가 만든 알고리즘을 보지 못하게하는 것이다. 나는 2 초 동안 그것을 보아도 작동하지 않는다는 것을 알 수있다. 실제로 실제 응용에 사용되는 실제 알고리즘입니다. – smallB

+0

내가 설명했던 것을 이해하지 못했을 까봐 걱정됩니다. 나는 정교하게 노력할 것이다 – Kos

+0

나는 나의 대답을 확장했다, 나는 당신이 지금 이해하기를 바란다. 또한 SO에 예의를 유지하고 답을 주셔서 감사합니다. – Kos

2

사람들이 문제를 이해하는 데 많은 어려움을 겪고있는 이유 중 일부는 "C++ 라인 계산" 자체가 알고리즘이기 때문이라고 생각합니다. 아마도 당신이 묻기를 시도하는 것은 "파일에서 C++ 라인을 어떻게 식별 할 수 있습니까?"입니다. 그것은 Kos가 설명하려고 노력했던 꽤 다른 질문 인 것입니다.

+0

그의 (Kos의) 알고리즘이 올바르지 않습니다. 더 복잡한 시나리오에서 코드 행을 정확하게 계산하지 않습니다. – smallB

+0

@smallB : 무엇과 같은? – Daniel

+0

같은 : 줄 1 :/* 주석 */코드;/* comment */code; 그의 알고리즘은이 행을 두 줄의 코드로 계산합니다. 이것은 잘못된 것입니다. 상상력을 사용할 수 없습니까? 그리고 코드 줄이 무엇인지 물어보기 전에, 제가 여러 번 설명하는 다른 주석을보십시오. – smallB