[ x20x @ 03.05.2003. 17:21 ] @
Učitaj sa tipkovnice NAREDBU. Ako je NAREDBA jednaka npr. cls -->
Obriši
ekran, ili ako je NAREDBA jednaka IME, prikaži ime (printf("Ime je
NEKAKO")).
Znaci : kada utipkam cls da mi se obrise ekran itd.?
Kako da to uradim uz pomoć SWICHA?
[ 6544616a006e @ 04.05.2003. 12:43 ] @
Napises neki sitni parser koji svaku naredbu pretvara u neku unapred definisanu char vrednost (mozes da definises recimo T_CLS, T_RM, T_KILL ... u 0, 1, 2...) a onda u jednom velikom switch-u da obradjujes svaki od njih zasebno.
[ x20x @ 04.05.2003. 21:05 ] @
Hvala na odgovoru ali to bas ne razumijem _"Napises neki sitni parser koji svaku naredbu pretvara u neku unapred definisanu char vrednost (mozes da definises recimo T_CLS, T_RM, T_KILL ... u 0, 1, 2...)"_! Kako da touradim (mislim kako kod glasi)?
[ Au197/79 @ 04.05.2003. 21:15 ] @
Pogledaj na http://www.puskice.co.yu/download/3/is/strukture/domaci.zip Tu se nalazi dom2 direktorijum. Tu se nalazi rešenje nekog zadatka u kojem je trebalo da se simulira kretanje kroz stablo direktorijuma, pa je postojao isti problem sa parsiranjem komandi tipa: cd a/b/c; ls a itd. Zato pogledaj glavni.c i glavni1.c kako je to rešeno na 2 načina u C-u. Pogledaj i bolja rešenja košrišćenjem heš-tabele stringova i komandi (koje su funkcije ili metode), jer je i to moguće uraditi u C++ (valjda je i C++ za toliko objektno orijentisan).
[ Dejan Lozanovic @ 04.05.2003. 21:56 ] @
potrazi malo na internetu lex & yacc literature, tamo ces videti takve stvari, inace teoriski pricano to su konacni automati, to sto ti trazis i tebi treba... Alli takve stvari se rucno ne ispalte raditi jer je to mukotrpan posao osim ako to ne radis u edukativne svrhe... vec je produktivnije iskoristiti lex & yacc i to se tamo svede na 5 minuta posla, i kao rezultat oni ti izgenerisu C kod koji posle lako povezes sa svojim programom....
[ leka @ 11.05.2003. 05:04 ] @
Code:

#include <string.h>
#include <stdio.h>

/* Dejan Lekic, <dejan%nu6.org>, http://dejan.nu6.org */

enum x20x
{
    T_BRISI = 0,    /* CLS token */
    T_IME,            /* token za komandu IME */
    T_PREZIME,        /* token komande PREZIME */
    T_KRAJ            /* token za KRAJ */
};    /* enum x20x */

#define MAX_LEN 4096    /* valjda nece niko kucati duzu liniju? */
#define NUM_COM 4        /* broj komandi koje obradjujemo */

char* saKomande[4] = {
    "BRISI",        /* odgovarajuca T_ vrednost: T_BRISI */
    "IME",            /* T_IME */
    "PREZ",            /* T_PREZIME, ne smemo "PREZIME" ! :) */
    "KRAJ"            /* T_KRAJ */
};

/**
 * Napomena, pisati ovakav "glupi" parser je idiotarija
 * narod mnogo pametniji od autora je napisao pomocne
 * alatke koji GENERISU PARSERE, jedna od njih je FLEX.
 */

char procesljaj(const char* sArg, char* sResto)
{
    char* pToken = NULL;
    int iSta = T_BRISI;        /* inicijalno je BRISI */
    char* pKomanda;
    char cRezultat = T_KRAJ;
    int ii = 0;
    char sKopija[MAX_LEN];
    
    strcpy(sKopija, sArg);
    /* hajde da nadjemo o kojoj komandi je rec */
    for (ii = 0; ii < NUM_COM; ii++)
    {
        pKomanda = strstr(sKopija, saKomande[ii]);
        if (pKomanda != NULL)
        {
            /**
             * Hajde da "pokupimo" argument komande...
             * ovo je poznata specificnost funkcije strtok() :) 
             */
            pToken = strtok(sKopija, saKomande[ii]);
            if (pToken)
            {
                strcpy(sResto, pToken);
            } /* if */
            pToken = strtok(NULL, saKomande[ii]);
            if (pToken)
            {
                strcpy(sResto, pToken);
                printf("DEBUG: %s\n", pToken);
            }
            return ii; /* Mozemo komotno da izadjemo odmah */
        } /* if */
        strcpy(sKopija, sArg); /* vracamo stari string */
    } /* for */
    return cRezultat;
} /* char procesljaj() */

int main(char argc, char** argv)
{
    char     sLinija[MAX_LEN];
    char*     pToken = NULL;
    char     bKraj = 1;
    char     sArgument[MAX_LEN];        
    
    /** 
     * valjalo bi ovo optimizovati ...
     * recimo da se koristi makar dinamicka alokacija
     */    
    for (; bKraj;)
    {
        gets(sLinija);
        switch (procesljaj(sLinija, sArgument))
        {
            case T_BRISI:
            {
                printf("x20x: BRISEM\n");
                break;
            } /* case */
            case T_IME:
            {
                printf("x20x: Komanda=IME, Argument=%s\n", sArgument);
                break;
            }
            case T_PREZIME:
            {
                printf("x20x: Komanda=PREZIME, Argument=%s\n", sArgument);
                break;
            }
            case T_KRAJ:
            {
                printf("x20x: Komanda=KRAJ Prekidam program!\n");
                bKraj = 0;
                break;
            }
            default:
                printf("x20x: Greska! Linija=\"%s\"", sLinija);
        } /* switch */
        sLinija[0]='\0';
    } /* for */
    return 0;
} /* main() */


Oprosti na eventualnim greškama, kod je napisan za otprilike pola sata...

Stvar radi ovako:
Code:

dejan@gnu ~/prj/c 
$ gmake x20x
cc     x20x.c   -o x20x
/tmp/ccA0RaEi.o(.text+0x16c): In function `main':
: the `gets' function is dangerous and should not be used.
dejan@gnu ~/prj/c 
$ ./x20x 
IME Dejan
x20x: Komanda=IME, Argument= Dejan
PREZ Lekic
x20x: Komanda=PREZIME, Argument= Lekic
BRISI Ovo
x20x: BRISEM
KRAJ
x20x: Komanda=KRAJ Prekidam program!


Ono, u pitanju je ultramegaprosti parser... ali je odgovor na ono što si pitao. Tu je i prilepljen sors fajl... ;)
[ x20x @ 11.05.2003. 13:47 ] @
Puno hvala - Leka -, program radi :-)
Thanks
[ x20x @ 11.05.2003. 13:52 ] @
A hvala i svima ostalima !
[ leka @ 11.05.2003. 15:13 ] @
Naglašavam da nisam džabe dao autput od gmake-a ... gets() zaista ne treba koristiti za neke ozbiljnije stvari.