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

[C++] Język skryptowy - Organizacja zasobów parsera i bloki kodu

Ostatnio zmodyfikowano 2014-12-31 23:53
Autor Wiadomość
C-Objective
» 2014-12-29 20:02:28
Napisz coś prostrzego.
Zrobiłem coś w rodzaju total commandera w konsoli. manadżer plików itd. Jednak lepiej zabierz się za coś prostrzego; Wpisujesz np. Najpierw out [enter] a potem wszystko do funkcji (co wypisać...). Takie prostoty. Potem normalny interpreter a potem kompilator!
P-123598
DejaVu
» 2014-12-30 01:25:43
@up: on nie musi pisać niczego prostszego, bo potrafi programować.

@RazzorFlame: na dobry początek możesz wczytywać zmienne do std::map. Poza tym powinieneś na dobry początek zrobić stos:
C/C++
struct TwojStos
{
    std::map < std::string, std::string > zmienneLokalne;
};

std::vector < TwojStos > stos;

bool odczytajWartoscZmiennej( const std::string & _nazwa, std::string & _outWartosc )
{
    for( int i = stos.size(); i >= 0; --i )
    {
        auto itFound = stos[ i ].find( _nazwa );
        if( itFound == stos[ i ].end() )
             continue;
       
        _outWartosc = itFound->second;
        return true;
    }
    return false;
}
Jak już poprawnie zaimplementujesz stos to potem możesz zastanawiać się jak go zoptymalizować.

/edit:
Dodam jeszcze, że jeżeli koniecznie chcesz się zorientować jak wydajnie organizować dane to polecam Ci poczytać najpierw o assemblerze i zorientować się jak są de-facto zorganizowane dane w pamięci.

Choć prawdę mówiąc... na Twoim miejscu na chwilę obecną skupiłbym się na tym, aby Twój język zaczął działać, a nie na tym, aby był on wydajny, bo to tylko komplikuje projekt, a i tak ma małe szanse na ukończenie go do postaci użytecznej dla innych użytkowników :)
P-123622
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-12-30 12:59:16
Dzięki DejaVu! Wczoraj sobie wszystko rozpisałem i doszedłem do wniosku, że wykonywanie skryptu powinno w C++ wyglądać jakoś tak:
C/C++
int main()
{
    KlasaZmiennejParsera arg1, arg2, arg3, returnValue;
    Parser parser;
    Skrypt script( "script.txt" );
   
    returnValue = parser.parseScript( & script, "entrypoint_function", 3, & arg1, & arg2, & arg3 );
    return 0;
}

Chodzi o to, że parser będzie wykonywał funkcje o nazwie entrypoint czy jak to tam nazwiemy i po wykonaniu skryptu będziemy mieli dostęp tylko do argumentów. Bloki kodu zawarte w { i } po wyjściu z niego będą po prostu usuwane wraz z jego zmiennymi. Zrobiłem to jakoś tak:
C/C++
class CodeScope
{
public:
    vector < KlasaZmiennejParsera > m_zmienne;
    CodeScope * m_child, * m_parent;
};

// podczas parsowania

//glowny blok kodu
CodeScope scriptCodeScope;
scriptCodeScope.m_parent = NULL;
scriptCodeScope.m_child = NULL;
CodeScope * actualScope = & scriptCodeScope;

// w parsowaniu tokenów
if( token == "{" )
{
    actualScope->m_child = new CodeScope;
    actualScope = actualScope->m_child;
}
else if( token == "}" )
{
    if( actualScope->m_parent )
    {
        actualScope = actualScope->m_parent;
        delete actualScope->m_child;
    }
    else
    {
        actualScope = NULL;
        // <-- po wykonaniu linijki u góry należy przestac parsowac skrypt
    }
}

Jak na razie mój parser potrafi sparsować takie coś:

function main (var arg1, var arg2, var arg3) {
   write_text("Przykladowy tekst \n A to tekst w nastepnej linii i \"przykladowy napis miedzy cudzyslowem\"");
   arg1 = "Argument nr 1";
   arg2 = "Argument nr 2";
   arg3 = "Argument nr 3";
}

Najbardziej cieszy mnie fakt, że składnia jest dość elastyczna, nie trzeba np. po main od razu dawać (), można nawiasy dać nawet w następnej linii, mozna tworzyc nowe bloki kodu.
Czy to jest dobre podejście?

Źle mnie zrozumiałeś DejaVu. Tworze ten parser do silnika, którego pisze w DirectX11. Pomyślałem, że przydadzą się skrypty. Mówiąc o zwykłym użytkowniku chodziło mi raczej o to jak ma wyglądać wykonywanie skryptu z poziomu kodu kogoś kto nie ma źródeł mojego parsera. Odpowiedź znalazłem taką jak podałem powyżej.
P-123640
1aam2am1
» 2014-12-30 23:58:32
Jak skończysz wstawisz gdzieś, kod? Dla przyszłych pokoleń.

Wie ktoś może jak dodać język lua do swojego programu jako język rozszerzający funkcjonalność już napisanej aplikacji.

Jak najlepiej zrobić własmy interpretator poleceń (prosta konsola) (switch case czy coś innego).
P-123709
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-12-31 13:57:22
Jak chcesz się dowiedzieć o tym LUA to załóż nowy temat, może ktoś Ci odpowie. Wątpie czy wstawie kod. Na internecie możesz znaleźć wiele języków skryptowych z otwartym źródłem a poza tym mój kod zapewne będzie bardzo mało zoptymalizowany.
P-123733
Kaikso
» 2014-12-31 15:40:53
Może zobacz jak to się w praktyce robi w jakiś program interpretujący skrypty z otwartym kodem źródłowym jak bash czy python.
P-123740
1aam2am1
» 2014-12-31 22:47:33
@up podąża stronę na której mógłbym to znaleźć.

Nie orjentuje sie na github.com
P-123771
Kaikso
» 2014-12-31 23:53:14
Myślę że po przeanalizowaniu części kodu takich programów zdobędziesz praktyczne podstawy do napisania własnego. A więc życzę powodzenia, a tu masz to co znalazłem ;)

ProgramLinkOpis
PerlInterpreter języka Perlhttp://www.cpan.org/src/
BashInterpreter powłoki Bashhttps://ftp.gnu.org/gnu/bash/
PythonInterpreter języka Pythonhttps://www.python.org​/downloads/source/
GNU GCCKompilator języków C, C++, Objective-C itp. do GNUhttps://gcc.gnu.org/

@Do użytkowników C++0x szczęśliwego nowego roku!!! :D
P-123774
1 « 2 »
Poprzednia strona Strona 2 z 2