Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

wxFBE - FreeBASIC Editor [Windows/Linux]
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 12.02.2013, 17:37    Titel: Antworten mit Zitat

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. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 13.02.2013, 17:32    Titel: Lexer und Parser vom fbc nutzen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 13.02.2013, 18:16    Titel: Antworten mit Zitat

Für sowas brauch ich keinen komplexen Compiler zu missbrauchen, das bekomm ich auch weitaus einfacher.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 13.02.2013, 18:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 13.02.2013, 18:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 15.07.2013, 18:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RWK



Anmeldungsdatum: 04.07.2011
Beiträge: 44

BeitragVerfasst am: 17.07.2013, 13:14    Titel: wxFBE Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 17.07.2013, 16:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 13.04.2014, 17:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 539
Wohnort: Jüterbog

BeitragVerfasst am: 07.09.2014, 15:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5939
Wohnort: Deutschland

BeitragVerfasst am: 07.09.2014, 16:04    Titel: CURDIR vs EXEPATH Antworten mit Zitat

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. zwinkern

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 539
Wohnort: Jüterbog

BeitragVerfasst am: 07.09.2014, 16:29    Titel: Antworten mit Zitat

Vielen Dank Sebastian.

EXEPATH ist bisher tatsächlich an mir vorbeigegangen lächeln

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
Code:
chdir exepath
ratsam?

Mutton

ps: worauf ich eigentlich hinaus will... ob wxFBE nicht das Arbeitsverzeichnis ins Projektverzeichnis setzen kann?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5939
Wohnort: Deutschland

BeitragVerfasst am: 07.09.2014, 18:07    Titel: Antworten mit Zitat

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
Code:
chdir exepath

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. lächeln EXEPATH ist halt genau "dafür gemacht", dann braucht man nicht solche Umweglösungen.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 07.09.2014, 18:10    Titel: Antworten mit Zitat

Das Verhalten ist ein Bug, da wxFBE eigentlich schon den Pfad wechseln sollte. Ich habe es im Repo korrigiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 996

BeitragVerfasst am: 03.01.2015, 17:46    Titel: Antworten mit Zitat

Hab nen neuen Build erstellt und hochgeladen. Es gibt jetzt auch einen ersten fltk emitter. Viel Spaß.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz