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

Problem z parserm

Ostatnio zmodyfikowano 2011-08-20 16:52
Autor Wiadomość
MrOsamaful
Temat założony przez niniejszego użytkownika
Problem z parserm
» 2011-08-02 14:05:34
Cześć, napisałem sobie prosty parser wyrażeń arytmetycznych, który działa wg tej gramatyki.


    Sum:
        Sum
        Sum + Mult
        Sum - Mult
    Mult:
        Mult
        Mult * Num
        Mult / Num
    Num:
        Num
No ale mam problem, z tym, żeby wykonywał całe działanie, jeżeli jest np 2 + 2 * 2
To wykona tylko 2 + 2
Jeżeli np 2 / 2 * 4
To wykona tylko 2 / 2
Czyli tylko tą pierwszą część. Nie mam pojęcia jak zrobić by obliczał całe wyrażenie, coś tam próbowałem ze znakiem końca wyrażenia itp ale nie za bardzo mi to wychodzi :/

main.cpp
C/C++
#include <iostream>
#include <vector>

using namespace std;

vector < int > num; // liczby
vector < char > op; // operatory

// działanie 2 / 3 * 4 @
void prep() {
    num.push_back( 2 );
    num.push_back( 3 );
    num.push_back( 4 );
    op.push_back( '/' );
    op.push_back( '*' );
    op.push_back( '@' ); // koniec działania
}

int pos = 0;
int op_pos = 0;

int parse_number() {
    int n = num[ pos ];
    pos++;
    cout << "Number: " << n << endl;
    return n;
}
int parse_mult() {
    cout << "Parse_mult" << endl;
    char o = op[ op_pos ];
    int n = parse_number();
   
    while( o == '*' || o == '/' )
    {
        cout << o << endl;
        switch( o )
        {
        case '*':
            op_pos++;
            return n *= parse_number();
           
        case '/':
            op_pos++;
            return n /= parse_number();
        }
    }
   
    return n;
}

int parse_sum() {
    cout << "Parse_sum" << endl;
    char o = op[ op_pos ];
    int n = parse_mult();
   
    while( o == '+' || o == '-' )
    {
        cout << o << endl;
        switch( o )
        {
        case '+':
            op_pos++;
            return n += parse_mult();
           
        case '-':
            op_pos++;
            return n += parse_mult();
        }
    }
    return n;
}

int parse_exp() {
    int n = 0;
    while( op[ op_pos ] != '@' )
    {
        n += parse_sum();
    }
    return n;
}
int main()
{
    prep();
    int n = parse_exp();
    cout << n << endl;
   
    return 0;
}
P-37924
mati1qazxsw2
» 2011-08-02 16:43:40
Poczytaj o Odwrotnej Notacji Polskiej, bardzo prosty do zaimplementowania.
P-37943
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-08-02 18:47:14
Ale ja nie chcę odwrotnej notacji polskiej >.>. Zresztą tu mam napisane 99% tylko nie wiem jak dodać, żeby pobierał kolejne argumenty... Po co mam pisać od nowa wszystko?
P-37948
akwes
» 2011-08-02 19:22:54
Bo czasami napisanie nowego projektu jest tańsze niż rozwijanie starego.
P-37949
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-08-02 19:29:47
Ale to jest kwestia dodania +- 15 linijek kodu...
P-37950
DejaVu
» 2011-08-05 16:08:50
Skoro wiesz, że to jest kwestia ~15 linii kodu to czemu pytasz się nas jak rozwiązać Twój problem? :)
P-38215
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-08-06 20:44:54
Bo mam z tym problem.
P-38288
mati1qazxsw2
» 2011-08-07 11:44:15
Mylisz się, to kwestia setek linii kodu.
P-38306
« 1 » 2
  Strona 1 z 2 Następna strona