Mam nastepujacy program:
#include <iostream>
using namespace std ;
// zbiór symboli
enum symbol {liczba, plus, minus, lnaw, pnaw, koniec};
char ch = ' '; // ostatni przeczytany znak
int lz = 0; // licznik znaków
char *wyr; // łańcuch znaków z wyrażeniem
symbol sym; // ostatni przeczytany symbol
int wart_liczby; // wartość ostatniej przeczytanej liczby
int wart_wyrazenia; // wartość wyrażenia
// Funkcje związane z analizą leksykalną
// Zamiana znaku na symbol
symbol zamien(char ch)
{
switch (ch)
{
case '+' : return plus;
case '-' : return minus;
case '(' : return lnaw;
case ')' : return pnaw;
case NULL: return koniec;
}
}
// Umieszcza następny znak w ch, zwiększa lz
void pob_znak()
{
ch = wyr[lz++];
}
// Oblicza wartość liczby naturalnej
void liczba_naturalna()
{
sym = liczba;
wart_liczby = int(ch) - int('0');
pob_znak();
while (isdigit(ch))
{
wart_liczby = wart_liczby * 10 + int(ch) - int('0');
pob_znak();
};
}
void pob_symbol()
{
// pomin wszystkie spacje
while (ch != '\n' && isspace(ch)) pob_znak();
if (isdigit(ch))
liczba_naturalna();
else
{
sym = zamien(ch);
pob_znak();
}
}
// Funkcje związane z analizą składni
void blad(int b)
{
cout << wyr << endl;
switch (b)
{
case 1: cout.width(lz); cout << "^"
<< "nieoczekiwany koniec wyrazenia" << endl; break;
case 2: cout.width(lz-1); cout << "^"
<< "oczekiwana cyfra lub \(" << endl; break;
case 3: cout.width(lz-1); cout << "^"
<< "oczekiwany \")\""<< endl; break;
case 4: cout.width(lz-1); cout << "^"
<< "oczekiwany operator lub koniec wyrazenia" <<endl;
};
exit(0);
}
//Interpretacja wyrażeń
void wyrazenie (int&);
// deklaracja zapowiadająca; funkcja wyrażenie wywołuje funkcję
// składnik, a funkcja składnik – funkcję wyrażenie
void skladnik (int &cz)
{
switch (sym)
{
case liczba: cz = wart_liczby; pob_symbol(); break;
case lnaw: pob_symbol();
wyrazenie(cz);
if (sym == pnaw)
pob_symbol();
else
blad(3);
break;
default: blad(2);
}
}
void wyrazenie (int &wyr)
{
int skl1, skl2;
symbol oper;
skladnik(skl1);
while (sym == plus || sym == minus)
{
oper = sym;
pob_symbol();
skladnik(skl2);
switch (oper)
{
case plus : skl1 = skl1 + skl2; break;
case minus: skl1 = skl1 - skl2; break;
}
}
wyr = skl1;
}
void main()
{
char w[] = "(2 + 3) - (2 + 3)";
wyr = new char(strlen(w)+1);
strcpy(wyr, w);
pob_symbol();
if (sym == koniec) blad(1);
wyrazenie(wart_wyrazenia);
if (sym != koniec)
blad(4);
else
cout << wyr << " = " << wart_wyrazenia << endl;
delete [] wyr;
}
Po skompilowaniu pojawia sie bledy:
20 D:\kalkulator.cpp plus' undeclared (first use this function) 21 D:\kalkulator.cpp
minus' undeclared (first use this function)
118 D:\kalkulator.cpp main' must return
int'
Dlaczego?