FirstStep - Eine Ausbildungssprache
Inhalt
- Die Struktur von FirstStep
- Link-Definitionen
- Schreibweise
- Blöcke
- Definitionen
- Deklarationen
- Anweisungen
- Funktionen und Prozeduren
- Klassen
- Ein- und Ausgabe, Dateien und Verbindungen
- Syntax
Anhang:
- Beispiele
- Module
- Dokumentation zu FirstStep in Word 6.0
Dokumentation zu FirstStep in Word 7.0
Dokumentation zu FirstStep in PostScript
zurück
Index
vor
11 Syntax
Die folgende Syntaxbeschreibung wurde für einen LL(k) Parser angefertigt. Sie stellt eine (dem derzeitigen Stand entsprechende) vollständige Syntaxbeschreibung von FirstStep dar und wird entsprechend von einem Parser akzeptiert; es wurde hier der Parser ANTLR der Purdue University, West Lafayette, Indiana von T. J. Parr verwendet.
In diesem Parser bedeutet der Ausdruck (...)?, daß die nachfolgende Regel nur angewendet wird, wenn die (beliebig vielen) syntaktischen Elemente ... in der Eingabe vorliegen. Durch diesen "Lookahead" kann diese LL-Grammatik auch für die relativ komplexe Syntax von FirstStep verwendet werden. Außerdem bedeutet (...)* die beliebig häufige Wiederholung, bzw. bei (...)+ die mindestens einmalige Wiederholung. {...} steht für die optionale Anwendung von ...; “|” gibt die Alternative an, während die linke Seite durch “:” von der rechten Seite der Regel getrennt ist. Eine Regel wird durch “;” abgeschlossen. Die Terminalsymbole werden als Text beschrieben und beginnen jeweils mit einem großen Buchstaben: Komma, Semikolon. Nichtterminale beginnen mit einem kleinen Buchstaben: programm, ausdruck usw.
Diese Grammatik erzeugt einen abstrakten Syntax-Baum, der von der semantischen Analyse durchlaufen werden kann, so daß daraus einfach der Zielcode erzeugt werden kann.
/* Programmblock */
programm : {LINK^ linkDef}
{DISCLOSE^ discloseDef}
{DEFINE^ defineDef}
{DECLARE^ declareDef}
DO^ anweisungen DONE
/* ende */
;
/* Def der Links im Programmblock */
linkDef : linkDefs (Semikolon linkDefs)*
;
linkDefs : Link textList
| StdIn Text
| StdOut Text
| StdErr Text
| declareDef
;
textList : Text (Komma Text)*
;
/* Disclose-Definitionen fuer das Öffnen von Objekten */
discloseDef :discloseObj Semikolon discloseDef
|
;
discloseObj : (Bezeichner Objekt)?
Bezeichner Objekt {aktParList}
| (Bezeichner Bezeichner)?
Bezeichner Bezeichner Ergibt {Bezeichner}
Objekt {aktParList}
;
aktParList : KlammerAuf aktParInnen KlammerZu
;
aktParInnen : aktParAusdruck (Komma aktParAusdruck)*
;
aktParAusdruck : SpitzKlAuf Bezeichner SpitzKlZu
| ausdruck
| Default
;
/* Definitionen von Typen, Funktionen usw. */
defineDef : (definition (Semikolon)+)*
;
definition : typDef
| Unit einheitDef
| Enum Bezeichner Gleich enumDef
| funktionDef | prozedurDef | klassenDef
;
typDef : Type Bezeichner Gleich {Referenz}
{Konstante} typangabe {Array arrayDef}
;
einheitDef : (einheitSpez)+ IntReal {zahl}
;
einheitSpez : zahl Einheit Gleich
;
enumDef : enumAusdruck (Komma enumAusdruck)*
;
enumAusdruck : Bezeichner {Ergibt ausdruck}
;
formParList : KlammerAuf formparInnen KlammerZu
;
formparInnen : formParAusdruck(Komma formParAusdruck)*
;
formParAusdruck : SpitzKlAuf parDef SpitzKlZu
| parDef {Ergibt ausdruck}
;
parDef : {Referenz} typangabe
{Array} Bezeichner
;
typList : typangabe (Komma typangabe)*
;
funktionDef : Funktion typList Bezeichner
{formParList} Gleich block
{Funktion Bezeichner}
;
prozedurDef : Prozedur Bezeichner
{formParList} Gleich block
{Prozedur Bezeichner}
;
klassenDef : (Privat Klasse)?
Privat Klasse namea:Bezeichner
klassenRest
{Privat Klasse nameb:Bezeichner}
| Klasse namec:Bezeichner
{formParList} klassenRest
{Klasse named:Bezeichner}
;
klassenRest : Gleich
{Disclose discloseDef}
{Define defineDef}
{Declare declareDef}
klasseBlock
;
klasseBlock : End
| Do anweisungen Done
;
/* Deklarationen von Objekten */
declareDef : (declaration (Semikolon))*
;
declaration : {Referenz} {Konstante} typangabe
{(Array arrayDef|Set)} Bezeichner
{Ergibt (ausdruck|BoolSet)}
(Komma Bezeichner
{Ergibt (ausdruck|BoolSet)} )*
;
typangabe : Integer | Real | Boolean | Bit |
Complex | Char | File | Text textDef
| Record recordDef | Bezeichner
;
arrayDef : EKLAuf dimension EKLZu
;
dimension : (weite Komma)? weite Komma dimension
| weite
;
weite : (ausdruck DoppelPkt)?
ausdruck DoppelPkt ausdruck
| ausdruck
;
textDef : EKLAufZu
| EKLAuf ausdruck EKLZu
|
;
recordDef : declareDef End Record
;
/* Anweisungsteil */
anweisungen : (anweisung1 Semikolon)?
anweisung1 (Semikolon)+ anweisungen
| anweisung1
|
;
anweisung1 : anweisung
| (For Bezeichner Repeat)? For Bezeichner Repeat
| (For Bezeichner Yield)? For Bezeichner Yield ausdruck
| (For Bezeichner Exit)? For Bezeichner Exit
| forBlock
| bedingteAnweisung
;
anweisung : (ergibtAusdruck ErgibtOpr)? zuweisung
| (ergibtAusdruck Komma)? zuweisung2
| Bezeichner {aktParList}
| Write {On Bezeichner} ausgabe
| Read {From Bezeichner} eingabe
| Return ausdruck (Komma ausdruck)*
| Open Bezeichner To
(Read From textAusdruck
| Write On textAusdruck
| Append To textAusdruck)
| Close Bezeichner
| Yield yieldForRest
| Exit {For Bezeichner}
| Repeat {For Bezeichner}
;
yieldForRest : (For)? For Bezeichner ausdruck
| ausdruck
;
ergibtAusdruck : (Bezeichner EKLAuf)?
Bezeichner EKLAuf
{(ausdruck Komma)? ausdruck Komma}
ausdruck EKLZu ergibtEKLRest
| (Bezeichner Punkt)?
Bezeichner Punkt ergibtAusdruck
| Bezeichner
;
textAusdruck : Text | Bezeichner
;
ergibtEKLRest : (Punkt)? Punkt ergibtAusdruck
|
;
zuweisung : ergibtAusdruck ErgibtOpr ausdruck
;
zuweisung2 : << int i =0; >>
ergibtAusdruck
(Komma ergibtAusdruck << i++; >>)+
Ergibt
ausdruck (Komma ausdruck << i--; >>)+
<< if(i=0)
printf("Difference in multiple assignment = %d\n",i);>>
;
ausgabe : (ausFormat Komma)? ausFormat Komma ausgabe
| ausFormat
;
eingabe : (Bezeichner Komma)? Bezeichner Komma eingabe
| Bezeichner
;
ausFormat : ausdruck
{DoppelPkt IZahl {DoppelPkt IZahl}}
| LF
;
ausdruck : (term (Plus|Minus))? term (Plus|Minus) ausdruck
| term
;
term : faktor {(Mal|Durch)? (Mal|Durch) term}
;
faktor : (faktor2 Hoch)? faktor2 Hoch faktor2
| (faktor2 Rest)? faktor2 Rest faktor2
| (faktor2 DivRest)? faktor2 DivRest faktor2
| (faktor2 Bezeichner)? faktor2 Bezeichner faktor2
| PlusMinus numFaktor | faktor2
;
faktor2 : (KlammerAuf ausdruck Komma)? complex
| KlammerAuf ausdruck KlammerZu
| wert
| (Bezeichner KlammerAuf)? Bezeichner aktParList
| ergibtAusdruck
| Zeichen
| Text
| menge
| laufAusdruck
| bedingterAusdruck
| Sin KlammerAuf ausdruck KlammerZu // und andere Funktionen
;
numFaktor : (KlammerAuf ausdruck Komma)? complex
| KlammerAuf ausdruck KlammerZu
| wert
| (Bezeichner KlammerAuf)? Bezeichner aktParList
| ergibtAusdruck
| menge
| laufAusdruck
| bedingterAusdruck
;
complex : KlammerAuf ausdruck Komma ausdruck KlammerZu
;
bAusdruck : bterm ((And|Or) bterm )*
;
bterm :(KlammerAuf bterm KlammerZu)?
KlammerAuf bterm KlammerZu
| True | False | Not bterm
| (ausdruck VergleichsOpr)? vergleich
| ergibtAusdruck
;
vergleich : ausdruck VergleichsOpr ausdruck
;
block : {Disclose discloseDef}
{Define defineDef}
{Declare declareDef}
Do anweisungen Done
;
forBlock : {Disclose discloseDef}
{Define defineDef}
{Declare declareDef}
{Prolog (anweisung Semikolon)+}
{For forBereich}
Do anweisungen
{Epilog anweisungen}
Done {For Bezeichner}
;
forBereich : Bezeichner forBereichRest
;
forBereichRest : {Ergibt ausdruck}
(By ausdruck {To ausdruck} |
To ausdruck {By ausdruck} | )
(While bAusdruck | Until bAusdruck
| If bAusdruck | Unless bAusdruck)*
{Yield ausdruck}
;
bedingteAnweisung : ifAnweisung
| caseAnweisung
| ifCaseAnweisung
| guardAnweisung
| rangeAnweisung
;
guardAnweisung : Guard guardRest
;
guardRest : bAusdruck (Break|block) {Semikolon} guardRest
| Else block {Semikolon} End Guard
| End Guard
;
ifAnweisung : If ifAnwRest
;
ifAnwRest : bAusdruck Then anweisungen
(ElseIf bAusdruck Then anweisungen)*
{Else anweisungen} End If
;
ifCaseAnweisung : IfCase (bAusdruck block {Semikolon})+
{Else block {Semikolon}} End IfCase
;
caseAnweisung : Case caseRest
;
caseRest : ausdruck Gleich caseBlock
;
caseBlock : ausdruck block {Semikolon} caseBlock
| (Others|Default|Else) block {Semikolon} End Case
| End Case
;
rangeAnweisung : Range rangeRest
;
rangeRest : ausdruck Until rangeBlock
;
rangeBlock : ausdruck block {Semikolon} rangeBlock
| (Others|Else) block {Semikolon} End Range
| End Range
;
bedingterAusdruck : ifAusdruck
| caseAusdruck
;
ifAusdruck : If bAusdruck Then ausdruck ifAusdRest
;
ifAusdRest : ElseIf bAusdruck Then
ausdruck ifAusdRest
| (Else ausdruck End If)?
| Else ausdruck
;
laufAusdruck : (For forBereich Do)?
For forBereich block
| (For forAusdBereich KlammerAuf)?
For forAusdBereich KlammerAuf ForOpr KlammerZu
ausdruck
;
forAusdBereich : Bezeichner {Ergibt ausdruck}
{By ausdruck}
{To ausdruck}
{Start ausdruck}
{endeAusdBedingung}
;
endeAusdBedingung : While bAusdruck
| Until bAusdruck
| If bAusdruck
| Unless bAusdruck
;
caseAusdruck : InCaseOf ausdruck IsEqualTo
caseAusdBlock
| Case KlammerAuf ausdruck KlammerZu Gleich
caseAusdBlock
;
caseAusdBlock : ausdruck block {Semikolon}
caseAusdBlock
| Others block {Semikolon} End Case
| End Case
;
zahl : numWert | HZahl | OZahl | DZahl
;
numWert : (IZahl|RZahl)
;
wert : (numWert einheitWort)?
| numWert | HZahl | OZahl | DZahl
;
einheitWort : Einheit einheitRest
;
einheitRest : (MalDurch Einheit)?
MalDurch Einheit einheitRest
|
;
menge : MengenKlAuf mengenListe MengenKlZu
;
mengenListe : MengenTerm (Komma MengenTerm)*
;
ende : Eof <<fprintf(stderr,"Syntax-Analye Ende\n");>>
;
Weitere Informationen zu FirstStep finden Sie in dem Buch
"System,
Model, Programm".
zurück
Index
vor