🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #6242

Re: Vraagje (Visual) C++

#6242
From: Bart.Vanhauwaert
Date: Sun, 15 Dec 2002 11:18
87 lines
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-mail
References: <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