PL/0: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Beispiel hinzugefügt)
K (Mermaid auf Diagrams umgestellt)
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[PL/0]] ist eine vereinfachte "[[Programmiersprache]]", die aus sehr wenigen Sprachkonstrukten besteht und die sehr kompakt mit folgender [[Formale Sprache#Grammatik|Grammatik]] in [[EBNF]] beschrieben werden kann:<syntaxhighlight lang="ebnf" line="1">
[[PL/0]] ist eine vereinfachte "[[Programmiersprache]]", die aus sehr wenigen Sprachkonstrukten besteht und die sehr kompakt mit folgender [[Formale Grammatik|Grammatik]] in [[EBNF]] beschrieben werden kann:<syntaxhighlight lang="ebnf" line="1">
<program>    = <block>
<program>    = <block> "."


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


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


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


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


<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 Terminalsymbole sind in Anführungszeichen gesetzt, um sie von den Strukturelementen der Grammatik zu unterscheiden.


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.
Zeile 30: Zeile 31:
aquadrat := a * a;
aquadrat := a * a;
WRITE aquadrat
WRITE aquadrat
END
END.
</syntaxhighlight>Der dazugehörige Ableitungsbaum sieht folgendermaßen aus:
</syntaxhighlight>Der dazugehörige Ableitungsbaum sieht folgendermaßen aus:


{{#mermaid:graph TD
<mermaid>
p("<code>&lt;program&gt;</code>") --- b("<code>&lt;block&gt;</code>") --- kw1("<code><strong>VAR</strong></code>") & i1("<code>&lt;ident&gt;</code>") & sem1("<code><strong>;</strong></code>") & s1("<code>&lt;statement&gt;</code>")
graph TD
p("<code>&lt;program&gt;</code>") --- b("<code>&lt;block&gt;</code>") & op0("<code><strong>.</strong></code>")
b --- kw1("<code><strong>VAR</strong></code>") & i1("<code>&lt;ident&gt;</code>") & com1("<code><strong>,</strong></code>") & i10("<code>&lt;ident&gt;</code>") & sem1("<code><strong>;</strong></code>") & s1("<code>&lt;statement&gt;</code>")
i1 --- a1("<code><strong>a</strong></code>")
i1 --- a1("<code><strong>a</strong></code>")
i10 --- aq10("<code><strong>aquadrat</strong></code>")
s1 --- kw2("<code><strong>BEGIN</strong></code>") & s2("<code>&lt;statement&gt;</code>") & sem2("<code><strong>;</strong></code>") & s3("<code>&lt;statement&gt;</code>") & sem3("<code><strong>;</strong></code>") & s4("<code>&lt;statement&gt;</code>") & kw3("<code><strong>END</strong></code>")
s1 --- kw2("<code><strong>BEGIN</strong></code>") & s2("<code>&lt;statement&gt;</code>") & sem2("<code><strong>;</strong></code>") & s3("<code>&lt;statement&gt;</code>") & sem3("<code><strong>;</strong></code>") & s4("<code>&lt;statement&gt;</code>") & kw3("<code><strong>END</strong></code>")
s2 --- kw4("<code><strong>READ</strong></code>") & i2("<code>&lt;ident&gt;</code>")
s2 --- kw4("<code><strong>READ</strong></code>") & i2("<code>&lt;ident&gt;</code>")
Zeile 51: Zeile 55:
i4 --- aq2("<code><strong>aquadrat</strong></code>")
i4 --- aq2("<code><strong>aquadrat</strong></code>")
classDef node stroke:none,fill:none;
classDef node stroke:none,fill:none;
}}
</mermaid>
[[Kategorie:Sprache]]

Aktuelle Version vom 31. Januar 2024, 13:41 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 Terminalsymbole sind in Anführungszeichen gesetzt, um sie von den Strukturelementen der Grammatik zu unterscheiden.

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:

graph TD p("<code>&lt;program&gt;</code>") --- b("<code>&lt;block&gt;</code>") & op0("<code><strong>.</strong></code>") b --- kw1("<code><strong>VAR</strong></code>") & i1("<code>&lt;ident&gt;</code>") & com1("<code><strong>,</strong></code>") & i10("<code>&lt;ident&gt;</code>") & sem1("<code><strong>;</strong></code>") & s1("<code>&lt;statement&gt;</code>") i1 --- a1("<code><strong>a</strong></code>") i10 --- aq10("<code><strong>aquadrat</strong></code>") s1 --- kw2("<code><strong>BEGIN</strong></code>") & s2("<code>&lt;statement&gt;</code>") & sem2("<code><strong>;</strong></code>") & s3("<code>&lt;statement&gt;</code>") & sem3("<code><strong>;</strong></code>") & s4("<code>&lt;statement&gt;</code>") & kw3("<code><strong>END</strong></code>") s2 --- kw4("<code><strong>READ</strong></code>") & i2("<code>&lt;ident&gt;</code>") s3 --- i3("<code>&lt;ident&gt;</code>") & op1("<code><strong>:=</strong></code>") & e1("<code>&lt;expression&gt;</code>") s4 --- kw5("<code><strong>WRITE</strong></code>") & e2("<code>&lt;expression&gt;</code>") i2 --- a2("<code><strong>a</strong></code>") i3 --- aq1("<code><strong>aquadrat</strong></code>") e1 --- t1("<code>&lt;term&gt;</code>") t1 --- f1("<code>&lt;factor&gt;</code>") & op2("<code><strong>*</strong></code>") & f2("<code>&lt;factor&gt;</code>") f1 --- a3("<code><strong>a</strong></code>") f2 --- a4("<code><strong>a</strong></code>") e2 --- t2("<code>&lt;term&gt;</code>") t2 --- f3("<code>&lt;factor&gt;</code>") f3 --- i4("<code>&lt;ident&gt;</code>") i4 --- aq2("<code><strong>aquadrat</strong></code>") classDef node stroke:none,fill:none;