Syntax bei Funktionsaufrufen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Spark Fountain

Betreff: Syntax bei Funktionsaufrufen

BeitragDo, Jul 14, 2016 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho,

ich hab schon mehrmals versucht eine eigene IDE für BlitzBasic incl. 3D und evtl. auch für BlitzMax zu programmieren. Grad versuche ich eine IDE mit JavaScript zu basteln, für die ich Ace benutzen will. Ace scheint ziemlich gut zu sein und bietet die Möglichkeit, eine Art eigene Syntaxbäume zu definieren, sodass Highlighting und sogar syntaktische Fehlererkennung möglich sind.

Jetzt komm ich auf den Punkt: Bei BlitzBasic hab ich festgestellt, dass man manche Funktionen sowohl mit parameter-umschließenden Klammern, als auch ohne diese schreiben kann. Zum Beispiel:

BlitzBasic: [AUSKLAPPEN]
Graphics 1024,768 ;klappt ohne Klammerung
Graphics(1024,768) ;klappt auch mit Klammerung


Dann gibt es aber wieder Funktionen, bei denen es verpflichtend zu sein scheint, die Klammern mit anzugeben:

BlitzBasic: [AUSKLAPPEN]
SetBuffer BackBuffer ;klappt nicht -> Buffer wird nicht erkannt
SetBuffer BackBuffer() ;klappt


Und wieder andere, die für mich zumindest wie "Funktionen" aussehen, aber keine Klammerung akzeptieren:

BlitzBasic: [AUSKLAPPEN]
Include "test.bb" ;klappt
Include("test.bb") ;klappt nicht (Expecting include filename)


Kann mir vielleicht jemand erklären, was die Unterschiede zwischen diesen Funktionsaufrufen sind? Damit ich meine IDE korrekt bauen kann, will ich gerne für jeden Befehl alle möglichen Schreibvarianten zulassen, ohne dass vermeintliche Syntaxfehler angezeigt werden. Soll heißen, im obersten Beispiele sollen beide Schreibweisen zugelassen werden, während im zweiten und dritten Beispiel die falschen Aufrufe erkannt werden sollten.

Gibt es darüber hinaus eine Möglichkeit (abgesehen davon, jedes Kommando mit und ohne Klammern zu testen) herauszufinden, welche Befehle Klammern akzeptieren und welche nicht bzw. nur mit Klammern funktionieren?

Vielen Dank für's Lesen bis hier unten, ich bin gespannt auf eure Tipps!
Gewinner der MiniBCC's #11, #13 und #28

DAK

BeitragDo, Jul 14, 2016 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, mal das Einfache als erstes: Include ist keine Funktion, sondern ein Keyword (wie z.B. For) und akzeptiert nie eine Klammer (ist einfach was Besonderes).

Funktionen, deren Return-Wert du haben willst, brauchen immer die Klammern. Funktionen, deren Return-Wert du ignorierst, brauchen die Klammer nicht. Ansonsten wäre die Syntax nicht eindeutig. Beispiel:

BlitzBasic: [AUSKLAPPEN]
Function a(x=4,y=1)
Return y
End Function

Function b(x=5,y=2)
Return y
End Function

a b 7 8


In diesem Fall ist es nicht klar, ob die 7 als y-Wert von A oder als x-Wert von B genommen werden soll. Deswegen: wird der Return-Wert einer Funktion verwendet (als Parameter für eine andere Funktion oder in einer Zuweisung an eine Variable) müssen Klammern hin.
Gewinner der 6. und der 68. BlitzCodeCompo

Spark Fountain

BeitragDo, Jul 14, 2016 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle Antwort! Ich dachte mir schon sowas in der Art, dass es mit den Rückgabewerten zu tun hat und dass Include und For etc. Sonderfälle sind.

Allerdings wird es dadurch sicherlich schwierig für eine IDE zu unterscheiden, wann Klammern notwendig sind und wann nicht, weil es immer kontextabhängig ist... Aber im Zweifelsfall kann ich auch darauf verzichten, dass benötigte Klammern gehighlighted werden. Der Compiler wird sowieso meckern Wink
Gewinner der MiniBCC's #11, #13 und #28

DAK

BeitragDi, Jul 19, 2016 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte eigentlich gehen. Eine Funktion, die keine Klammern verwendet, muss als Erstes in der Zeile stehen (mit Ausnahme von Whitespace davor).

BlitzBasic: [AUSKLAPPEN]
f ;gültig
f() ;gültig
g f() ;gültig
g f ;nicht glütig
x=f() ;gültig
x=f ;auch gültig, heißt aber was Anderes.


Wegen dem letzten Punkt: man kann eine Variable haben, die den gleichen Namen haben, wie Funktionen. z.B.:

BlitzBasic: [AUSKLAPPEN]
Print(MilliSecs()) ; Gibt die aktuelle Uptime in ms zurück
Print(MilliSecs) ; Gibt 0 aus (nämlich den Wert der Variable MilliSecs, die noch nicht verwendet wurde)
MilliSecs = 1000
Print(MilliSecs) ; Gibt 1000 aus


Also im Grunde: Ein Funktionsaufruf ist definiert als
-) Ein Identifier, dann "(", dann beliebig viele Parameter getrennt mit ",", dann ein ")"
oder
-) Ein Identifier am Beginn der Zeile, nicht gefolgt von einem "=", schon gefolgt von beliebig vielen Parametern getrennt mit ","
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group