Talen en automaten/2011-12/producten/GW-BASIC

Uit Werkplaats
Ga naar: navigatie, zoeken

Page Break




Algolfrag.jpg

Talen en automaten

Erik Barendsen


 © comments



GW-BASIC

Frank Arts, Taco Westerouen van Meeteren



Talen en automaten 2011-12



14:20 A






Frank Arts Bachelor Informatica
 e-mail 

cursuspagina


Taco Westerouen van Meeteren Bachelor Informatica
 e-mail 

cursuspagina


Page Break





Beschrijving

Algemene beschrijving

GW-BASIC is een dialect van de programmeertaal BASIC, gemaakt door Microsoft.

Syntax

Dit zijn enkele voorbeelden van syntax in GW-BASIC:

variabelen
Voorbeeldnummer Syntax Beschrijving
1 $ String
2  % Integer
3  ! Single-precision
4 # Double-precision
Rekenkundige operatoren
Voorbeeldnummer Syntax Beschrijving
5 + Optellen
6 - Aftrekken
7 * Vermenigvuldigen
8 / Delen
9 ^ Machtverheffen
10 ( Haakje openen
11 ) Haakje sluiten
Relationele operatoren
Voorbeeldnummer Syntax Beschrijving
12 = is gelijk aan
13 <> is niet gelijk aan
14 < is kleiner dan
15 > is groter dan
16 <= is kleiner dan of gelijk aan
17 >= is groter dan of gelijk aan
Statements
Voorbeeldnummer Syntax Beschrijving
18 0-65529 Regelnummers
19 IF THEN GOTO Regelnummer verwijs commando
20 PRINT output commando
21 LEN() string-lengte commando
22 END Einde programma commando

1. String

<source lang="basic"> S$ = "Dit is een string." </source> Een string is een stukje tekst.

2. Integer

<source lang="basic"> N% = 1234 </source> Een integer is een nummer zonder cijfers achter de komma.

3. single-precision variabele

<source lang="basic"> K! = 1234.5 </source> Een single-precision variabele is een nummer dat komma getallen kan bevatten, en uit maximaal 7 cijfers bestaat.

4. double-precision variabele

<source lang="basic"> X# = 1234567.1234 </source> Een double-precision variabele is een nummer dat koma getallen kan bevatten, en uit minstens 7 cijfers bestaat.

18. Regelnummers

<source lang="basic"> 10 A$ = "Regelnummer 10" 20 B$ = "Regelnummer 20" 30 C$ = "Regelnummer 30" 40 D$ = "Regelnummer 40" 50 E$ = "Regelnummer 50" 60 F$ = "Regelnummer 60" 70 G$ = "Regelnummer 70" 80 H$ = "Regelnummer 80" 90 I$ = "Regelnummer 90" </source> Regelnummers nemen per regel telkens met tien eenheden toe. Het is mogelijk de regelnummers naar eigen wens aan te passen.

19. IF ... THEN GOTO ...

<source lang="basic"> 10 A% = 60 20 B% = 60 30 IF A% = B% THEN GOTO 50 40 C% = 30 50 C% = 80 </source>

Als A gelijk is aan B, ga dan naar regel 50.

22. End

<source lang="basic"> 10 A%=60 20 B%=40 30 C%=A%+B% 40 PRINT C% 50 END </source>

Het END commando wordt gebruikt om het programma te laten eindigen.

Regulier?

We gaan laten zien dat de taal GW-BASIC niet regulier is: Stel dat GW-BASIC wél regulier is, dan kunnen we voor elk groot woord dat langer is dan k toestanden, pompen volgens het pomplemma.

Ons woord: <source lang="basic"> 10 ((((...(2^3)^4)^5)^...)^k) </source>

Hier hebben we k nummers, en dus ook k haakjes openen op het begin en in totaal k haakjes sluiten.

Het pomplemma stelt: L heeft k toestanden. Voor elk woord m uit taal L geldt: Als m ≥ k, m = uvw en lengte(uv) ≤ k en lengte(v) > 0, dan geldt uviw ∊ L.

Dit passen we toe op ons woord. Lengte(uv) ≤ k, op het begin van ons woord staan k haakjes openen, dus uv bestaat alleen uit haakjes openen. Als we dit gaan pompen, ontstaan er meer haakjes openen. We krijgen nu echter meer haakjes openen dan haakjes sluiten, en dit mag niet volgens GW-BASIC. Het gepompte w ∉ L, dus GW-BASIC is niet regulier.

Contextvrij?

Om aan te tonen dat GW-BASIC een contextvrije taal is, kunnen we een grammatica maken waar de taal aan voldoet.

Een typisch, algemeen scriptje uit GW-BASIC ziet er als volgt uit:

<source lang="basic">

10 functie 20 functie 30 functie 40 functie 50 statement 60 END

</source>

Dit kan bijvoorbeeld zijn:

<source lang="basic">

10 Input "What is your name?" A$ 20 PRINT "Hello, "; A$ 30 INPUT "Do you want to restart? (yes/no)" B$ 40 B$ = LEFT$(B$, 1) 50 IF B$ = "yes" THEN GOTO 10 60 END

</source>

Elke regel heeft een regelnummer, gevolgd door een functie/bewerking of een statement.

Een grammatica voor dit systeem:

S → aA

A → bB

B → cC

C → dD

D → S | E

E → ℷ

Uiteraard zijn er variaties, maar het principe is hetzelfde. Een functie representeren we met een terminal. Elke regel heeft slechts één bewerking/functie, dus er is één terminal nodig. Elk regelnummer kunnen representeren met een non-terminal. Om naar de volgende regel te gaan, verwijzen we dus naar de volgende non-terminal. Voor een IF ... THEN GOTO xx, waar xx = regelnummer, kunnen we dus naar de bijbehorende non-terminal verwijzen. Het END commando kunnen we representeren door als terminal het lege woord te gebruiken en door geen nieuwe non-terminal toe te voegen.