PL/0: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Beispiel hinzugefügt)
Keine Bearbeitungszusammenfassung
Zeile 18: Zeile 18:
<term>      = <factor> { ( * | / ) <factor> }
<term>      = <factor> { ( * | / ) <factor> }


<factor>    = <ident> | <number> | ( <expression> )
<factor>    = <ident> | <number> | "(" <expression> ")"
</syntaxhighlight>Als <code><ident></code> werden alle möglichen Bezeichner behandelt, als <code><number></code> numerische Werte. Die detaillierten Regeln dazu ersparen wir uns an dieser Stelle, damit die Ableitungen nicht zu kompliziert werden.
</syntaxhighlight>Als <code><ident></code> werden alle möglichen Bezeichner behandelt, als <code><number></code> numerische Werte. Die detaillierten Regeln dazu ersparen wir uns an dieser Stelle, damit die Ableitungen nicht zu kompliziert werden. Die Klammern in der letzten Zeile sind in Anführungszeichen gesetzt, weil hier wirklich im Wort stehende Klammern gemeint sind und die Klammern kein Syntaxelement der Grammatik sind.


Mit dieser Grammatik kann überprüft werden, ob ein Stück Programmtext syntaktisch korrekt ist, nämlich genau dann, wenn es problemlos aus dem Nichtterminalsymbol <code><program></code> abgeleitet werden kann.
Mit dieser Grammatik kann überprüft werden, ob ein Stück Programmtext syntaktisch korrekt ist, nämlich genau dann, wenn es problemlos aus dem Nichtterminalsymbol <code><program></code> abgeleitet werden kann.

Version vom 6. September 2023, 14:52 Uhr

PL/0 ist eine vereinfachte "Programmiersprache", die aus sehr wenigen Sprachkonstrukten besteht und die sehr kompakt mit folgender Grammatik in EBNF beschrieben werden kann:

<program>    = <block>

<block>      = [ CONST <ident> = <number> { , <ident> = <number> } ; ]
               [ VAR <ident> { , <ident> } ; ]
               { PROCEDURE <ident> ; <block> ; } <statement>

<statement>  = [ <ident> := <expression> | CALL <ident> | READ <ident> | WRITE <expression> |
               BEGIN <statement> { ; <statement> } END |
               IF <condition> THEN <statement> |
               WHILE <condition> DO <statement> ]

<condition>  = ODD <expression> |
               <expression> ( = | # | < | <= | > | >= ) <expression>

<expression> = [ + | - ] <term> { ( + | - ) <term> }

<term>       = <factor> { ( * | / ) <factor> }

<factor>     = <ident> | <number> | "(" <expression> ")"

Als <ident> werden alle möglichen Bezeichner behandelt, als <number> numerische Werte. Die detaillierten Regeln dazu ersparen wir uns an dieser Stelle, damit die Ableitungen nicht zu kompliziert werden. Die Klammern in der letzten Zeile sind in Anführungszeichen gesetzt, weil hier wirklich im Wort stehende Klammern gemeint sind und die Klammern kein Syntaxelement der Grammatik sind.

Mit dieser Grammatik kann überprüft werden, ob ein Stück Programmtext syntaktisch korrekt ist, nämlich genau dann, wenn es problemlos aus dem Nichtterminalsymbol <program> abgeleitet werden kann.

Beispiel

Dieses PL/0-Programm liest eine Zahl vom Benutzer ein (READ a), berechnet ihr Quadrat und gibt dieses dann aus (WRITE aquadrat)

VAR a, aquadrat;
BEGIN
READ a;
aquadrat := a * a;
WRITE aquadrat
END

Der dazugehörige Ableitungsbaum sieht folgendermaßen aus: