Article View: be.comp.programming
Article #6242Re: Vraagje (Visual) C++
From: 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/
Technical Details
Message-ID:
<gdohta.v2e.ln@ns1.irule.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-08!supernews.com!priapus.visi.com!news-out.visi.com!hermes.visi.com!skynet.be!skynet.be!louie!not-for-mailReferences:
<atgjt6$1favd$1@sinclair.be.wanadoo.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,70841337d0efd9d3
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2002-12-15 05:20:10 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-08!supernews.com!priapus.visi.com!news-out.visi.com!hermes.visi.com!skynet.be!skynet.be!louie!not-for-mail
Sender: - <bvh@ns1.irule.be>
From: Bart.Vanhauwaert@nowhere.be
Subject: Re: Vraagje (Visual) C++
Newsgroups: be.comp.programming
References: <atgjt6$1favd$1@sinclair.be.wanadoo.com>
User-Agent: tin/1.4.4-20000803 ("Vet for the Insane") (UNIX) (Linux/2.2.17-21mdksecure (i686))
Date: Sun, 15 Dec 2002 12:18:08 +0100
Message-ID: <gdohta.v2e.ln@ns1.irule.be>
Lines: 87
NNTP-Posting-Host: 194.78.202.248
X-Trace: 1039957524 reader0.news.skynet.be 74338 194.78.202.248
X-Complaints-To: abuse@skynet.be