Problem z parserem tekstu.
Ostatnio zmodyfikowano 2011-02-10 12:28
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.
#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
{
}
|
|
DejaVu |
» 2011-02-09 18:25:35 Mhm... skoro zrobiłeś pętlę for to i nic dziwnego, że się wywołują parę razy. |
|
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: |
|
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. |
|
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. |
|
malan |
» 2011-02-09 22:52:46 Jak sobie poradziłeś? :) |
|
DejaVu |
» 2011-02-09 23:35:10 Zapewne zrobił to co napisałem - temat zamykam. |
|
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. |
|
« 1 » |