PL/0: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) (Seite angelegt.) |
Sn (Diskussion | Beiträge) (Beispiel hinzugefügt) |
||
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 Sprache#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> | | <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. | </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. | ||
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. | |||
=== Beispiel === | |||
Dieses PL/0-Programm liest eine Zahl vom Benutzer ein (<code>READ a</code>), berechnet ihr Quadrat und gibt dieses dann aus (<code>WRITE aquadrat</code>)<syntaxhighlight lang="pascal" line="1"> | |||
VAR a, aquadrat; | |||
BEGIN | |||
READ a; | |||
aquadrat := a * a; | |||
WRITE aquadrat | |||
END | |||
</syntaxhighlight>Der dazugehörige Ableitungsbaum sieht folgendermaßen aus: | |||
{{#mermaid:graph TD | |||
p("<code><program></code>") --- b("<code><block></code>") --- kw1("<code><strong>VAR</strong></code>") & i1("<code><ident></code>") & sem1("<code><strong>;</strong></code>") & s1("<code><statement></code>") | |||
i1 --- a1("<code><strong>a</strong></code>") | |||
s1 --- kw2("<code><strong>BEGIN</strong></code>") & s2("<code><statement></code>") & sem2("<code><strong>;</strong></code>") & s3("<code><statement></code>") & sem3("<code><strong>;</strong></code>") & s4("<code><statement></code>") & kw3("<code><strong>END</strong></code>") | |||
s2 --- kw4("<code><strong>READ</strong></code>") & i2("<code><ident></code>") | |||
s3 --- i3("<code><ident></code>") & op1("<code><strong>:=</strong></code>") & e1("<code><expression></code>") | |||
s4 --- kw5("<code><strong>WRITE</strong></code>") & e2("<code><expression></code>") | |||
i2 --- a2("<code><strong>a</strong></code>") | |||
i3 --- aq1("<code><strong>aquadrat</strong></code>") | |||
e1 --- t1("<code><term></code>") | |||
t1 --- f1("<code><factor></code>") & op2("<code><strong>*</strong></code>") & f2("<code><factor></code>") | |||
f1 --- a3("<code><strong>a</strong></code>") | |||
f2 --- a4("<code><strong>a</strong></code>") | |||
e2 --- t2("<code><term></code>") | |||
t2 --- f3("<code><factor></code>") | |||
f3 --- i4("<code><ident></code>") | |||
i4 --- aq2("<code><strong>aquadrat</strong></code>") | |||
classDef node stroke:none,fill:none; | |||
}} |
Version vom 6. September 2023, 14:46 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.
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: