LINUX.ORG.RU

Самодельный пасер на С++ : не удаляет комментарии

 


0

1

Написал программу которая должна удалять комментарии в файле исходного кода С++. Условия: // /* и */ не будут содержаться в самих комментариях, строках и символьных константах. Проблемы: '*/' сохраняется в файл. Код:

#include <iostream>
#include <fstream>

using namespace std;

const char *filename = "commandLine.h";
const char *filename2 = "commandLine_out.h";

int main()
{
    ifstream in(filename, ios_base::in);
    if(!in.is_open())
        std::cout << "Input file not found!" << std::endl;

    ofstream out(filename2);
    if(!out.is_open())
        std::cout << "Output file not found!" << std::endl;

    string line;

    bool inComment = false;
    bool afterComment = false;
    int i = 0;

    while(getline(in, line))
    {
        i++;
        line.append("\n");
//        std::cout << inComment << std::endl;

        if(afterComment == true)
        {
//            inComment = false;
            afterComment = false;
        }

        if(line.find("//")!=std::string::npos)
            inComment = true;

        if(line.find("/*")!=std::string::npos)
            inComment = true;
        if(line.find("*/")!=std::string::npos)
            inComment = false;
            afterComment = true;
        std::cout << i << " : " << inComment << "-" << afterComment <&lt; std::endl;
        if((inComment == false)&&(afterComment == true))
        {
            out << line;
        }
    }

    out.close();
    in.close();
    cout << "Hello world!" << endl;
    return 0;
}



Последнее исправление: zanac1 (всего исправлений: 2)

Осиль LORCODE, читать невозможно.

panter_dsd ★★★★
()

Тебе нужен конечный автомат

yoghurt ★★★★★
()

Составь список символов, которые нужно особым образом обрабатывать, нарисуй табличку NxN, продумай переходы из одного состояния в другое и реализуй конечный автомат, делов-то.

mix_mix ★★★★★
()

/* */ может комментировать не только целые строки.

И если даже работать только с целыми строками, логику надо корректировать.

Elyas ★★★★★
()

Считаю, школьникам не надо помогать с их домашними заданиями. Учиться должны, а не спрашивать ответ на лоре.

Quickern ★★
()
Последнее исправление: Quickern (всего исправлений: 1)
Ответ на: комментарий от zanac1

в условии вывода текущей строки оставить толькко inComment, а работу с after и сбросом inComment подправить.

Elyas ★★★★★
()

кстати, если хочешь сделать хорошо, а не абы как, то вот пример на котором 100% завалится весь курс :

#include <stdio.h>
int main() {
        int i;
        i=1;
#define OP +1
        printf("value=%d\n",i/** remove this **/OP);
        return 0;
}

MKuznetsov ★★★★★
()

«Компиляторы: принципы, технологии и инструменты - Книга, Альфред Ахо и Джеффри Ульман»

Купи себе такую и по голове постучи...

anonymous
()
Ответ на: комментарий от Elyas

спасибо

теперь все работает. Проблема была в этом:

if(line.find("*/")!=std::string::npos)
            inComment = false;
            afterComment = true;
Компилятор не воспринимал эту конструкцию как одно целое. Огородил скобками - полет нормальный. Тема закрыта

zanac1
() автор топика
10 марта 2017 г.
 if(line.find("//")!=std::string::npos)
            inComment = true;

Так парсеры не пишут. Одни лишь проблемы обретешь. Используй конечные автоматы. Вот вики, например, с хорошими схемами.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

ты о чем вообще? тебе же прямо написали

Компилятор не воспринимал эту конструкцию как одно целое. Огородил скобками - полет нормальный. Тема закрыта

Anoxemian ★★★★★
()
Ответ на: комментарий от MKuznetsov

А что особенного в твоём примере кроме многострочности? Курс скорее завалится на символах комментариев внутри строки.

staseg ★★★★★
()
Ответ на: комментарий от Anoxemian

О том, что то, чем занимается ОП есть забивание гвоздей микроскопом.

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.