Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z parserem tekstu.

Ostatnio zmodyfikowano 2011-02-10 12:28
Autor Wiadomość
MrOsamaful
Temat założony przez niniejszego użytkownika
Problem z parserem tekstu.
» 2011-02-09 17:25:45
Postanowiłem napisać program tłumaczący mój język na c++, problem polega na tym, że funkcje parsowania tokenów wywołują się kilka razy i nie wiem nawet dlaczego, zobaczcie na kod.
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <vector>

using namespace std;


class Parse
{
private:
   
   
    vector < string > all;
    string read;
    char * cstr;
    char * p;
    char * inputname;
    char * outputname;
   
   
public:
    Parse() { }
    Parse( char * out,
    char * in )
    {
        inputname = in;
        outputname = out;
    }
    ofstream output;
    ifstream input;
    void setInput( char * inName )
    {
        input.open( inName );
        inputname = inName;
    }
    void setInput()
    {
        input.open( inputname );
       
    }
    void setOutput( char * outName )
    {
        output.open( outName );
        outputname = outName;
    }
    void setOutput()
    {
        output.open( outputname );
       
    }
   
    string textRead()
    {
        getline( input, read );
        return read;
    }
    char * lineGet( string sstring )
    {
       
        read = sstring;
       
        cstr = new char[ read.size() + 1 ];
        strcpy( cstr, read.c_str() );
        return cstr;
    }
    inline char * tokenize( char * cstring, char * delim )
    {
        return strtok( cstring, delim );
    }
    void tokenSave( char * token )
    {
        all.push_back( token );
    }
    void tokenFlush( char * & token, char * delim )
    {
        token = strtok( NULL, " " );
    }
    inline int lineNumber()
    {
        return all.size();
    }
    void parseInt( int i ) {
    }
    void parseChar( int i ) {
    }
    void parseArr( int i ) {
    }
    void parseMain( int i ) {
        if( all[ i ] == "START" )
        {
            cout << "Znaleziono poczatek programu na linii: " << i << endl;
            output << "int main()";
           
        }
        else
        {
        }
    }
    void parseAsm( int i ) {
    }
    void parseBlockStart( int i ) {
        if( all[ i ] == "{" )
        {
            cout << "Otwarto blok kodu na linii: " << i << endl;
            output << all[ i ] << "\n";
           
        }
    }
    void parseBlockEnd( int i ) {
        if( all[ i ] == "}" )
        {
            cout << "Zamknieta blok kodu na linii: " << i << endl;
            output << all[ i ] << "\n";
           
        }
    }
   
} parse;

int main()
{
    string read;
    char * p;
    parse.setInput( "input2.txt" );
    parse.setOutput( "output2.txt" );
    while( parse.input.good() )
    {
        read = parse.textRead();
        char * line = parse.lineGet( read );
        p = parse.tokenize( line, " " );
       
        while( p != NULL )
        {
            cout << p << endl;
            parse.tokenSave( p );
            parse.tokenFlush( p, " " );
        }
        for( int i = 0; i < parse.lineNumber(); i++ )
        {
            parse.parseMain( i );
            parse.parseBlockEnd( i );
            parse.parseBlockStart( i );
           
        }
    }
    system( "pause" );
}

plik input2.txt

START
{

}
P-28092
DejaVu
» 2011-02-09 18:25:35
Mhm... skoro zrobiłeś pętlę for to i nic dziwnego, że się wywołują parę razy.
P-28102
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-02-09 19:13:56
Wiem, tylko zamiast wypisywać:

Znaleziono poczatek programu na linii:
Otwarto blok kodu na linii:
Zamknieto blok kodu na linii:

wypisuje:

Znaleziono poczatek programu na linii:
Znaleziono poczatek programu na linii:
Otwarto blok kodu na linii:
Znaleziono poczatek programu na linii:
Otwarto blok kodu na linii:
Znaleziono poczatek programu na linii:
Zamknieto blok kodu na linii:
P-28106
DejaVu
» 2011-02-09 19:23:52
Skoro wstawiłeś parsowanie wewnątrz pętli wczytującej plik to co linię wykonuje się parsowanie istniejących wierszy.
P-28108
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-02-09 19:25:13
Dobra czaję, spróbuję to naprawić.

Dobra, poradziłem sobie. Dzięki za pomoc.
P-28109
malan
» 2011-02-09 22:52:46
Jak sobie poradziłeś? :)
P-28115
DejaVu
» 2011-02-09 23:35:10
Zapewne zrobił to co napisałem - temat zamykam.
P-28119
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-02-10 12:28:41
Zrobiłem to co mi polecił DejaVu, jeszcze raz dzięki za pomoc.
P-28136
« 1 »
  Strona 1 z 1