|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 12.02.2013, 18:37 Titel: |
|
|
Nein, das geht nicht, der Compiler ist nicht so aufgebaut, dass man den Code leicht übernehmen könnte. Die Idee, solche Teile als "lib" verwenden zu können, die gibt es schon länger, wird allerdings mangels Zeit/wichtigeren Dingen/Aufwand von den Entwicklern verworfen.
Der Compiler ist übrigens etwas mehr als nur Lexer und Parser. Immerhin kommt hinten ja auch wieder was raus, woraus lauffähige Programme werden. |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 13.02.2013, 18:32 Titel: Lexer und Parser vom fbc nutzen |
|
|
Ich habe einige tests gemacht, um Informationen aus dem fb compiler zu holen. Dazu habe ich im Parser, Lexer und Preprocessor jeweils ein paar print befehle eingefügt.
Dadurch erhalte ich aus folgendem Quellcode ein einfache Ausgabe
maintest.bi
Code: | Declare Sub TestText(t as String) |
maintest.bas
Code: | #include "maintest.bi"
Sub Test()
Dim i as Integer
Dim as Integer a,b
for i = 1 to 5
if i = 1 then
a=i
else
a=a*i
end if
Print _
"a: ";a,"i: ";i
Next
End Sub
Test()
TestText("TestText")
sleep
|
testtext.bas
Code: | Sub TestText(t as String)
print t
End Sub |
Code: |
D:\opt\FreeBASIC>fbc-new.exe maintest.bas testtext.bas
-------------------------------------------------------------------------
line: text class dtype position length
-------------------------------------------------------------------------
1: # 7 35 0 1 maintest.bas
1: include maintest.bas
1: maintest.bi 4 3 9 11 maintest.bas
-------------------------------------------------------------------------
line: text class dtype position length
-------------------------------------------------------------------------
1: Declare 1 -2147483648 0 7 D:\opt\FreeBASIC\maintest.bi
1: Sub 1 -2147483648 8 3 D:\opt\FreeBASIC\maintest.bi
1: TestText 0 -2147483648 12 8 D:\opt\FreeBASIC\maintest.bi
1: ( 6 40 20 1 D:\opt\FreeBASIC\maintest.bi
1: t 0 -2147483648 21 1 D:\opt\FreeBASIC\maintest.bi
1: as 1 -2147483648 23 2 D:\opt\FreeBASIC\maintest.bi
1: String 1 -2147483648 26 6 D:\opt\FreeBASIC\maintest.bi
1: ) 6 41 32 1 D:\opt\FreeBASIC\maintest.bi
3: Sub 1 -2147483648 26 3 maintest.bas
3: Test 0 -2147483648 30 4 maintest.bas
3: ( 6 40 34 1 maintest.bas
3: ) 6 41 35 1 maintest.bas
5: Dim 1 -2147483648 40 3 maintest.bas
5: i 0 -2147483648 44 1 maintest.bas
5: as 1 -2147483648 46 2 maintest.bas
5: Integer 1 -2147483648 49 7 maintest.bas
6: Dim 1 -2147483648 58 3 maintest.bas
6: as 1 -2147483648 62 2 maintest.bas
6: Integer 1 -2147483648 65 7 maintest.bas
6: a 0 -2147483648 73 1 maintest.bas
6: , 6 44 74 1 maintest.bas
6: b 0 -2147483648 75 1 maintest.bas
7: for 1 -2147483648 78 3 maintest.bas
7: i 0 -2147483648 82 1 maintest.bas
7: = 5 61 84 1 maintest.bas
7: 1 3 7 86 1 maintest.bas
7: to 1 -2147483648 88 2 maintest.bas
7: 5 3 7 91 1 maintest.bas
8: if 1 -2147483648 98 2 maintest.bas
8: i 0 -2147483648 101 1 maintest.bas
8: = 5 61 103 1 maintest.bas
8: 1 3 7 105 1 maintest.bas
8: then 1 -2147483648 107 4 maintest.bas
9: a 0 -2147483648 119 1 maintest.bas
9: = 5 61 120 1 maintest.bas
9: i 0 -2147483648 121 1 maintest.bas
10: else 1 -2147483648 127 4 maintest.bas
11: a 0 -2147483648 141 1 maintest.bas
11: = 5 61 142 1 maintest.bas
11: a 0 -2147483648 143 1 maintest.bas
11: * 5 42 144 1 maintest.bas
11: i 0 -2147483648 145 1 maintest.bas
12: end 1 -2147483648 152 3 maintest.bas
12: if 1 -2147483648 156 2 maintest.bas
13: Print 2 -2147483648 163 5 maintest.bas
14: a: 4 3 177 3 maintest.bas
14: ; 6 59 182 1 maintest.bas
14: a 0 -2147483648 183 1 maintest.bas
14: , 6 44 184 1 maintest.bas
14: i: 4 3 185 3 maintest.bas
14: ; 6 59 190 1 maintest.bas
14: i 0 -2147483648 191 1 maintest.bas
15: Next 1 -2147483648 194 4 maintest.bas
17: End 1 -2147483648 202 3 maintest.bas
17: Sub 1 -2147483648 206 3 maintest.bas
19: Test 0 -2147483648 213 4 maintest.bas
19: ( 6 40 217 1 maintest.bas
19: ) 6 41 218 1 maintest.bas
20: TestText 0 -2147483648 221 8 maintest.bas
20: ( 6 40 229 1 maintest.bas
20: TestText 4 3 230 8 maintest.bas
20: ) 6 41 240 1 maintest.bas
21: sleep 0 -2147483648 243 5 maintest.bas
-------------------------------------------------------------------------
line: text class dtype position length
-------------------------------------------------------------------------
1: Sub 1 -2147483648 0 3 testtext.bas
1: TestText 0 -2147483648 4 8 testtext.bas
1: ( 6 40 12 1 testtext.bas
1: t 0 -2147483648 13 1 testtext.bas
1: as 1 -2147483648 15 2 testtext.bas
1: String 1 -2147483648 18 6 testtext.bas
1: ) 6 41 24 1 testtext.bas
2: print 2 -2147483648 30 5 testtext.bas
2: t 0 -2147483648 36 1 testtext.bas
3: End 1 -2147483648 39 3 testtext.bas
3: Sub 1 -2147483648 43 3 testtext.bas
|
diff Änderungen am fbcompiler aktuelle git version
Zitat: |
src/compiler/lex.bas | 1 +
src/compiler/parser-toplevel.bas | 4 ++++
src/compiler/pp.bas | 1 +
3 files changed, 6 insertions(+)
diff --git a/src/compiler/lex.bas b/src/compiler/lex.bas
index f59146d..a184161 100644
--- a/src/compiler/lex.bas
+++ b/src/compiler/lex.bas
@@ -1932,6 +1932,7 @@ read_char:
end select
+Print lex.ctx->linenum;":",t->text,t->class,t->dtype,lex.ctx->lastfilepos,t->len,env.inf.name
end sub
'':::::
diff --git a/src/compiler/parser-toplevel.bas b/src/compiler/parser-toplevel.bas
index 287412f..913f299 100644
--- a/src/compiler/parser-toplevel.bas
+++ b/src/compiler/parser-toplevel.bas
@@ -78,6 +78,10 @@ end sub
sub cProgram()
dim as integer startlevel = pp.level
+Print
+Print "-------------------------------------------------------------------------"
+Print "line:","text","class","dtype","position","length"
+Print "-------------------------------------------------------------------------"
'' For each line...
do
parser.stmt.cnt += 1
diff --git a/src/compiler/pp.bas b/src/compiler/pp.bas
index 9d46800..53a88b6 100644
--- a/src/compiler/pp.bas
+++ b/src/compiler/pp.bas
@@ -171,6 +171,7 @@ end sub
''
function ppParse( ) as integer
+Print lex.ctx->linenum;":",lex.ctx->head->text,env.inf.name
'' note: when adding any new PP symbol, update ppSkip() too
select case as const lexGetToken( LEXCHECK_KWDNAMESPC )
|
|
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 13.02.2013, 19:16 Titel: |
|
|
Für sowas brauch ich keinen komplexen Compiler zu missbrauchen, das bekomm ich auch weitaus einfacher. |
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 13.02.2013, 19:35 Titel: |
|
|
Zitat: | Für sowas brauch ich keinen komplexen Compiler zu missbrauchen, das bekomm ich auch weitaus einfacher.
|
Ich weiss, dass der Compiler für sowas eigentlich nicht gedacht ist, aber sobald du deinen einfachen Parser erweiterst für all die "einfachen" spezial Fälle, z.B. wie Doppelpunkt und Unterstrich dann wird der auch ziemlich komplex. Umgehen kann man das vielleicht mit regulären Ausdrücken aber die sind nicht wirklich einfacher.
Ich habe nur ein paar einfache Print Befehle eingefügt und bekomme dadurch schon sehr genaue Information zu einzelnen Token und deren Typ |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 13.02.2013, 19:40 Titel: |
|
|
Das was du da hast ist nur die Zerlegung des Codes, das macht mein Code auch. Das einzige, was du da mehr hast ist die Zurodnung einer class, die hier aber extrem einfach gestrickt ist. Satzzeichen, Keywords, Variablen, alles eine eigene class. Das nachzubauen ist simpel. Was wirklich interessant wäre, das ist der AST, den hast du in deinem Code aber auch nicht drin.
Wie gesagt, der Compiler eignet sich nicht dafür, das Bisschen an Infos, das ich gern noch rausholen will, kann ich auch einfacher haben. |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 15.07.2013, 19:56 Titel: |
|
|
Aufgrund aktueller Entwicklungen möchte ich doch auf den neuen Preview Build von wxFBE aufmerksam machen.
Bitte auch das aktuelle Video (Nutzung unter Windows 7) beachten, es zeigt den Einsatz des visuellen Designers (in gleicher Form funktioniert das auch unter Linux). |
|
Nach oben |
|
|
RWK
Anmeldungsdatum: 04.07.2011 Beiträge: 44
|
Verfasst am: 17.07.2013, 14:14 Titel: wxFBE |
|
|
Jetzt hätte ich es fast schon wieder vergessen was dazu zu schreiben....
Also die IDE finde ich schon mal richtig gut soweit.
Na klar besonders das Du den FormBuilder jetzt einbaust.
Mir ist nur noch nicht klar wie ich jetzt die einzelnen Komponenten anspreche.
Also sprich ich füge einen Button hinzu und ein RichText Feld.
Wie gebe ich das jetzt einfach ein, das bei Klick auf Button ein entsprechender Text in dem Fenster erscheint ?
oder ein Beispiel hier aus FireFly, eine Sub die aufgerufen wird wenn ein Laufteilnehmer durchs Ziel läuft. Wie würde ich sowas dann in wxFBE eingeben?
Code: | Sub Zieleinlauf
StartNr = CInt(FF_TextBox_GetText( HWND_frmZeitnahme_txtPlatz ))
vbox = "In_Zeit1" & Format(lfdNr,"000") & ":" & ZielZeit & ":" & Format(StartNr,"000")
TSNEPlay_SendMSG(0, vBox)
vbox = Format(lfdNr,"000") & ":" & ZielZeit & ":" & Format(StartNr,"000")
FF_ListView_InsertItem( HWND_frmZeitnahme_ListPlatz, lfdNr-1, 0, Str(lfdNr))
FF_ListView_InsertItem( HWND_frmZeitnahme_ListPlatz, lfdNr-1, 2, Str(StartNr))
FF_ListView_InsertItem( HWND_frmZeitnahme_ListPlatz, lfdNr-1, 1, Zielzeit)
lfdNr = lfdNr + 1
FF_TextBox_SetText( HWND_frmZeitnahme_txtPlatz, "")
End Sub |
Grüße |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 17.07.2013, 17:42 Titel: |
|
|
Wie ein Event und der Handlercode hinzugefügt werden, das zeigt das Video.
Du willst jetzt allerdings andere Widgets beim Klick manipulieren. Hier gibt es aufgrund der momentanen Codegenerierung noch Schwierigkeiten. Es aber einige Neuerungen auf dem Weg.
Einerseits wird der momentan exportierte Code so angepasst, dass du später auf alle Widgets des Fensters stets Zugriff hast, auch aus den Handlern, weil sich alles eine Klasse teilen wird. Andererseits wird es eine neue Art von exportiertem Code geben, mit der alles noch viel besser und schöner und toller wird. Allerdings möchte ich dazu noch keine Einzelheiten verraten (in dem Fall ist es auch nicht mein Projekt^^).
Man darf also gespannt bleiben. |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 13.04.2014, 18:12 Titel: |
|
|
Es gibt eine neue Version. Die größte Änderung sind die nun eingeführten Emitter Plugins.
Dabei handelt es sich um Plugins, die den Code Emitter des integrierten Designers austauschen können. So kann man eben Custom Code ausgeben lassen, und zwar nicht nur wx-c, sondern was auch immer man dort implementiert (etwa WinAPI, GTK, sGUI, etc.).
Bisher ist allerdings nur ein wx-c emitter enthalten, der Code dafür lässt sich dem Repo entnehmen.
Wichtig bei eigenen Emittern: es werden die mdTypes benötigt.
Der Download-Link steht wie immer auf der Projektseite, alternativ kann auch das Update Plugin in einer bisherigen wxFBE Version gestartet werden.
Edit: Tutorial zum Erstellen von Emittern (englisch): Developing emitters for wxFBE |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 563 Wohnort: Jüterbog
|
Verfasst am: 07.09.2014, 16:43 Titel: |
|
|
Ich experimentiere grad ein wenig herum und stehe etwas auf dem Schlauch...
Quickstart -> temp.exe im richtigen Verzeichnis -> Curdir innerhalb des Compilates zeigt woanners hin -> logischerweise kein Zugriff auf externe Dateien.
Was mache ich falsch? eventuelle readme natürlich noch nicht gelesen
Mutton |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 07.09.2014, 17:04 Titel: CURDIR vs EXEPATH |
|
|
Hallo,
CURDIR verweist immer auf das Arbeitsverzeichnis, nicht auf das Verzeichnis, in dem die EXE-Datei und ggf. weitere Ressourcen (Grafiken, Bibliotheken, ...) liegen. Wenn du das Verzeichnis der EXE-Datei ermitteln willst, brauchst du die EXEPATH-Funktion.
Erstell und compilier dir mal ein Programm, das nur Folgendes enthält:
Code: | PRINT "CurDir = "; CURDIR
PRINT "ExePath = "; EXEPATH |
Angenommen, dieses Programm liegt nach dem Compilieren in C:\FreeBASIC als DirTest.exe.
Dann öffne dir mal eine cmd.exe und gib ein: "cd C:\Windows\Fonts".
Anschließend gib den vollen Pfad zu deiner eben erstellten EXE ein ("C:\FreeBASIC\DirTest.exe").
Das Ergebnis wird sein:
Code: | CurDir = C:\Windows\Fonts
ExePath = C:\FreeBASIC |
Auf CURDIR kann man sich also nicht verlassen, wenn es darum geht, auf externe Dateien zuzugreifen, die man mit dem eigenen Programm ausliefert. Es kann der Fall auftreten, dass CURDIR zufällig das gleiche wie EXEPATH ausgibt, aber das heißt dann, dass das Arbeitsverzeichnis im Moment eben das EXE-Verzeichnis ist. Es kann aber auch jedes andere sein. Nur EXEPATH gibt tatsächlich immer das Verzeichnis aus, wo die EXE liegt - unabhängig vom Arbeitsverzeichnis.
CURDIR wäre eher für den Fall, dass du z. B. eine Alternative zu "ls"/"dir" programmiert hast, die die Dateiliste nicht einfach auf der Konsole ausgibt, sondern vorsingt.
Du würdest zunächst das Verzeichnis deiner singenden "SINGDIR.EXE" zur PATH-Umgebungsvariable hinzufügen, damit es von überall aus ohne Pfad aufrufbar ist.
Anschließend könntest du in der cmd.exe z. B. nach "C:\Windows\Fonts" cd-en und dort dann ausführen "singdir" statt "dir". Deine SINGDIR.EXE wüsste dank CURDIR, in welchem Arbeitsverzeichnis du gerade bist, und könnte dir die Liste der Schriftarten vorsingen.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 563 Wohnort: Jüterbog
|
Verfasst am: 07.09.2014, 17:29 Titel: |
|
|
Vielen Dank Sebastian.
EXEPATH ist bisher tatsächlich an mir vorbeigegangen
Das würde aber bedeuten das alle meine Programme "nur einem glücklichen Umstand wegen" externe Dateien öffnen können... :/
Um relativ zur exe zu bleiben wäre dann immer ein ratsam?
Mutton
ps: worauf ich eigentlich hinaus will... ob wxFBE nicht das Arbeitsverzeichnis ins Projektverzeichnis setzen kann? |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 07.09.2014, 19:07 Titel: |
|
|
Muttonhead hat Folgendes geschrieben: | Das würde aber bedeuten das alle meine Programme "nur einem glücklichen Umstand wegen" externe Dateien öffnen können... :/ |
Bzgl. externer Dateien im Verzeichnis der EXE, ja.
Wenn der User eine Verknüpfung zu einer EXE anlegt (z. B. auf dem Desktop), kann er darin das Arbeitsverzeichnis sogar beliebig per GUI definieren:
Muttonhead hat Folgendes geschrieben: | Um relativ zur exe zu bleiben wäre dann immer ein
ratsam? |
Das wäre ein möglicher Workaround, aber so gut fände ich die Lösung mit manuellem Überschreiben des Arbeitsverzeichnisses nicht.
Es wäre viel besser, einfach per "Suchen und ersetzen" die Vorkommen von CURDIR durch EXEPATH zu ersetzen. EXEPATH ist halt genau "dafür gemacht", dann braucht man nicht solche Umweglösungen. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 07.09.2014, 19:10 Titel: |
|
|
Das Verhalten ist ein Bug, da wxFBE eigentlich schon den Pfad wechseln sollte. Ich habe es im Repo korrigiert. |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 03.01.2015, 18:46 Titel: |
|
|
Hab nen neuen Build erstellt und hochgeladen. Es gibt jetzt auch einen ersten fltk emitter. Viel Spaß. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|