Thread View: be.comp.programming
3 messages
3 total messages
Started by Me
Sun, 15 Dec 2002 00:55
Vraagje (Visual) C++
Author: Me
Date: Sun, 15 Dec 2002 00:55
Date: Sun, 15 Dec 2002 00:55
10 lines
1443 bytes
1443 bytes
Ik heb een functie nodig vb. int bereken(CString parameter) Stel ik krijg een STRING binnen in de vorm "((12-5)*2+6)/2" en de functie moet 10 teruggeven. Wat nu nog ontbreekt is de inhoud van de functei uiteraard. Hoe begin ik er in godsnaam aan ? Men dient niet enkel rekening te houden met de haakjes, maar ook de prioriteit van de operators. Dank bij voorbaat, Steven
Re: Vraagje (Visual) C++
Author: Aquila
Date: Sun, 15 Dec 2002 09:10
Date: Sun, 15 Dec 2002 09:10
17 lines
1720 bytes
1720 bytes
"Me" <me@me.me> wrote: >Ik heb een functie nodig vb. int bereken(CString parameter) >Stel ik krijg een STRING binnen in de vorm "((12-5)*2+6)/2" en de functie >moet 10 teruggeven. >Wat nu nog ontbreekt is de inhoud van de functei uiteraard. >Hoe begin ik er in godsnaam aan ? >Men dient niet enkel rekening te houden met de haakjes, maar ook de >prioriteit van de operators. >Dank bij voorbaat, > Typisch voorbeeldje van gebruik van stacks voor parsing, kijk bijvoorbeeld eens op <http://homepage.smc.edu/kennedy_john/PARSETREES.PDF>. Maar er moet nog wel meer te vinden zijn als je goed doorgooglet! -- Aquila "May the source be with you"
Re: Vraagje (Visual) C++
Author: Bart.Vanhauwaert
Date: Sun, 15 Dec 2002 11:18
Date: Sun, 15 Dec 2002 11:18
87 lines
3087 bytes
3087 bytes
Me <me@me.me> wrote:
> Ik heb een functie nodig vb. int bereken(CString parameter)
> Stel ik krijg een STRING binnen in de vorm "((12-5)*2+6)/2" en de functie
> moet 10 teruggeven.
> Wat nu nog ontbreekt is de inhoud van de functei uiteraard.
> Hoe begin ik er in godsnaam aan ?
> Men dient niet enkel rekening te houden met de haakjes, maar ook de
> prioriteit van de operators.
Voor dit soort kleine zaken schrijf je best zelf (met de hand)
een LL(1) parser. Een volledig uitgelegd voorbeeld vind je hiervan
in Stroustroup the C++ programming language (vanaf p107 voor de
3th ed, hoofdstuk 6). Je kan anders ook vanaf
http://www.irule.be/bvh/c++/fastdep sources van een programma
downloaden dat ook zoiets bevat. In theorie komt het hier op neer
int expression()
{
int result=term();
while (!end)
switch (next_char())
{
case '+' : result += term(); break;
case '-' : result -= term(); break;
default : error(); return result;
}
return result;
}
int term()
{
int result=factor();
while (!end)
switch (next_char())
{
case '*' : result *= factor(); break;
case '/' : result /= factor(); break;
case '%' : result %= factor(); break;
default : error(); return result;
}
return result;
}
int factor()
{
if (end)
{
error(); return 0;
}
int result = 0;
char c = next_char();
switch (c)
{
case '(' :
{
result = expression();
if (next_char() != ')')
error();
return result;
}
case '-' :
{
result = expression();
return -result;
}
}
// (1)
if ((c>='0') && (c<='9'))
return c-'0';
error();
}
1. probeer zelf je ervan te vergewissen dat deze code 'werkt' om te begrijpen
hoe ze werkt.
2. je moet drie functies zelf schrijven end() : return een bool om aan te
geven dat we aan het einde van onze string zijn; next_char() : return
iedere keer de volgende char in de string; error() : geeft aan dat er een
probleempje is in de opgegeven string bv 1++3 etc
3. wil je als factoren ook toelaten dat er meercijferige getallen worden
opgegeven, dan moet je de code bij (1) wat uitbreiden.
4. idem dito als je ook variabelen wil toelaten.
--
http://www.irule.be/bvh/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads