나는 C++ 프로젝트의 라인 카운터에 대한 연구를하고 있었고, 나는 그들이 사용하는 알고리즘에 관심이 많다. 누구든지 그러한 알고리즘의 구현을 어디에서 볼 수 있는지 알고 있습니까? 라인 카운터에 의해, 당신은 라인을 계산 프로그램을 의미하는 경우코드 라인을 카운트
답변
음, 다음 알고리즘은 매우 간단하다 : 단지 코드 '\n'
의 수를 계산합니다. 반면, C++ 문장을 계산하거나 다른 메트릭을 계산하는 프로그램을 의미하는 경우 ... 100 % 정확하지는 않지만 '}'및 '을 계산하여 꽤 좋은 결과를 얻었습니다. ' (주석 및 문자열 및 문자 리터럴을 무시하고, 코스). 더 정확한 것은 실제로는 실제 C++ 구문 분석이 필요합니다.
나는 C++ 파일에서 물리적 인 코드 라인을 계산할 알고리즘을 의미했다. 어리 석다 '와'; ' 가장 단순한 경우에는 너무 원시적입니다. – smallB
@smallB 측정하려는 대상에 따라 다릅니다. 실제로 라인 일 경우'wc -l'을 사용하십시오.그리고 알고리즘은 실제로' '\ n ";을 계산하는 것입니다. '}'와 ';'를 세는 것이 훨씬 더 원시적입니다. (이것은 프로그램에서 문장의 수에 대한 좋은 1 차 근사값을 제공한다). –
# Kanes 코드의 줄을 세는 것은 '\ n'을 세는 것과 아무런 관련이 없습니다. 코멘트는 어떻습니까? 코멘트는 줄이 아니지만 '\ n', ';'을 구문 분석하면 계산됩니다. 또는 '}'. C++ 파일의 코드 줄 수를 계산할 수있는 알고리즘에 관심이 있습니다. – smallB
코드 카운터의 무료 오픈 소스 소스 라인 인 cloc이 있습니다. C++를 포함한 많은 언어를 지원합니다. 나는 개인적으로 그것을 사용하여 프로젝트의 행 수를 얻는다.
sourceforge 페이지에서 다운로드 할 수있는 perl 소스 코드를 찾을 수 있습니다.
줄 번호를 계산하기 위해 실제로 코드를 구문 분석 할 필요는 없습니다. 토큰 화하기에 충분합니다.
이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을 사용하여 직접 토큰 화를 작성할 수 있어야합니다.
실제로 출력을 사용하여 코드 줄 (예 : "코드"토큰, 즉 주석을 제외한 모든 토큰이 시작되는 줄)을 계산하는 방법은 앞에서 설명한 알고리즘을 참조하십시오.
사람들이 문제를 이해하는 데 많은 어려움을 겪고있는 이유 중 일부는 "C++ 라인 계산" 자체가 알고리즘이기 때문이라고 생각합니다. 아마도 당신이 묻기를 시도하는 것은 "파일에서 C++ 라인을 어떻게 식별 할 수 있습니까?"입니다. 그것은 Kos가 설명하려고 노력했던 꽤 다른 질문 인 것입니다.
실례지만 내 카운트는 무엇입니까? –
회선 계산이란 무엇입니까? – Pacane
간략하게 설명해주세요. –