Я работаю с этим миром, который считает логические строки в программе, пропуская комментарии и черные линии. Счетная линия работает, но я не знаю, как пропустить строки комментариев, я пытаюсь
if (line == "//")
{
comment++;
}
но он проверяет только строки, начинающиеся с "//"
и если рядом есть текст, это не считается строкой комментария: /
В конце, когда я знаю общее количество строк и общее количество строк комментариев, я вычту totalLines-commentLines
знать реальные номера программных строк.
Может кто-то помочь мне с этим?
Спасибо
#include <iostream>
#include <fstream>
#include <istream>
using namespace std;
int main()
{
int numlines = 0;
int comment = 0;
string line;
ifstream myfile("wr.cpp");
while (myfile.good())
{
getline(myfile, line);
if (line == "//")
{
comment++;
}
if (line == "/**/")
{
comment++;
}
++numlines;
}
cout << "Number of lines: " << numlines << endl;
cout << "Number of comment lines: " << comment << endl;
return 0;
}
Я думаю, что ваша методология … ошибочна.
Рассмотрим строку вроде:
int x = 1; // starting from 1 because [some reason]
Поскольку ваш код стоит прямо сейчас, он считается только строкой без комментариев. Как вы уже описали, что бы вы хотели сделать, это будет считаться только строкой комментариев.
На самом деле, tThis содержит и код, и комментарий, поэтому вы обычно хотите считать его как код а также комментарий, а не только один или другой.
Делать эту работу хорошо, безусловно, нетривиально. Очевидные проблемы, с которыми вы сталкиваетесь:
#if
s, #ifdef
с и т. д.Вероятно, есть больше проблем, чем это (хотя это только то, что пришло мне в голову сразу), но их должно быть достаточно, чтобы дать хотя бы общую картину.
Итог: я думаю, чтобы продвинуться далеко вперед в этом (вообще) том, что вы делаете, чтобы по крайней мере нуждаться в достаточно полной / точной C ++ лексер. Вам, вероятно, не нужен полный анализатор, но я думаю, что любая попытка, которая не использует полный лексер C ++, почти наверняка потерпит неудачу, вероятно, довольно плохо и довольно часто.
Других решений пока нет …