Talen en automaten/2011-12/producten/GW-BASIC
GW-BASIC
Frank Arts, Taco Westerouen van Meeteren
Talen en automaten 2011-12
14:20 A |
Inhoud
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 | 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.