Seite 1 von 2

PBLexerGen + PBParserGen

Verfasst: 18.03.2012 21:37
von CSHW89
Hi Leute,
ich möchte euch mal mein neues größeres Projekt vorstellen. Es geht um ein Lexer- und ein Parsergenerator für PB. Was ist das genau?
Wer sich schonmal mit syntaktischer Analyse von Texten befasst hat, weiß wie kompliziert und aufgebläht so ein Programm werden kann. Selbst ein kleines Programm, dass z.B. ein mathematischen Ausdruck analysieren und berechnen soll, kann sehr schnell sehr unübersichtlich werden, ganz zu schweigen von einem Compiler einer neuen Programmiersprache.
Und genau hier setzen meine Programme an. Sie bieten eine sehr einfache Möglichkeit, die Syntax der Texte, die analysiert werden sollen, mit RegEx's und einer Grammatik zu beschreiben. Die beiden Generatoren erstellen damit dann einen funktionierenden Lexer und Parser.

Damit man eine Vorstellung hat, hier mal ein kleines Beispiel, wie so ein Programm aussehen würde, das mathematische Ausdrücke analysieren kann.

Lexer.pb:

Code: Alles auswählen

%%
<<EOF>>  { ProcedureReturn §<EOF> }
[ \t]    { } ; ignore char
[0-9]+   { ProcedureReturn §NUMBER }
[+\-*/]  { ProcedureReturn Asc(yytext) } ; operators
.        { yyerror("Invalid char: "+yytext) }
%%
Parser.pb:

Code: Alles auswählen

%token NUMBER
%left '+' '-'
%left '*' '/'

%type eval exp
%start eval

%%

exp: ;[
  NUMBER
  | exp '+' exp
  | exp '-' exp
  | exp '*' exp
  | exp '/' exp
;]
eval: exp
%%
Main.pb:

Code: Alles auswählen

IncludeFile "Parser_out.pb"
IncludeFile "Lexer_out.pb"

Procedure EvalString(string.s)
  *yyin = @string
  Debug yyparser()
EndProcedure

EvalString("2 + 3 * 4")
Für diejenigen, die einfach mal schnell was ausprobieren wollen, können dazu ein vorgefertigtes Beispiel benutzen:
- Starte "PBMakeTool\PBMakeToolInstaller.exe" und drücke auf "Installieren" (installiert Tools in der PB-IDE)
- Starte "PBGenerators\Tutorial\Rechner\Rechner.pb" aus der PB-IDE

Für diejenigen, die sich näher mit dem Thema beschäftigen wollen, habe ich ein kleines Tutorium geschrieben, das die Entwicklung des Beispiels beschreibt.

Noch ein paar Worte zum PBMakeTool: Es ist ein Zusatztool, dass man in der PB-IDE installieren kann, damit die Generatoren beim Starten eines Programms mit einem Lexer/Parser aufgerufen werden. Siehe dazu mehr Details in der Readme zum PBMakeTool.


Also ich kann die Generatoren sehr empfehlen, wenn man mal die Syntax eines Textes analysieren, oder gar ein Compiler einer neuen Sprache entwickeln will. Ich selbst hab sie schon bei einem selbstgeschriebenen Computer Algebra System und einem Grundgerüst einer neuen Sprache benutzt, und kann es mir inzwischen nicht mehr wegdenken ;). Sie sind also bereits in der Wildnis erprobt :mrgreen: .
Für Fragen, Verbesserungsvorschläge, Wünsche und Lob ( :wink: ) bin ich natürlich offen.

Hier nun der Link:
http://cshw89.mevedia.de/PBGenerators.zip

lg Kevin

PS:
Ein paar allgemeine Informationen zu Generatoren:
http://de.wikipedia.org/wiki/Compilerbau
http://de.wikipedia.org/wiki/Lex_%28Informatik%29
http://de.wikipedia.org/wiki/Yacc

Re: PBLexerGen + PBParserGen

Verfasst: 18.03.2012 22:08
von ts-soft
:allright:
Aber für sowas bin ich zu dumm :wink:

Re: PBLexerGen + PBParserGen

Verfasst: 19.03.2012 20:51
von Frabbing
Ich leider auch. Sehe da irgendwie keinen Vorteil. :shock:

Re: PBLexerGen + PBParserGen

Verfasst: 19.03.2012 21:26
von DrShrek
Gibt ja schon Lex und Yacc.
Was ist also an Deinen Lexer/Parser besser?

Re: PBLexerGen + PBParserGen

Verfasst: 19.03.2012 21:47
von NicTheQuick
DrShrek hat geschrieben:Gibt ja schon Lex und Yacc.
Was ist also an Deinen Lexer/Parser besser?
Er erstellt PB-Code?

Re: PBLexerGen + PBParserGen

Verfasst: 19.03.2012 23:42
von CSHW89
NicTheQuick hat geschrieben:
DrShrek hat geschrieben:Gibt ja schon Lex und Yacc.
Was ist also an Deinen Lexer/Parser besser?
Er erstellt PB-Code?
Jo Richtig. Im Grunde ist es ja Lex und Yacc für PB, auch was weitestgehend die Syntax angeht.
lg Kevin

PS:
Frabbing hat geschrieben:Ich leider auch. Sehe da irgendwie keinen Vorteil. :shock:
Naja am Anfang vielleicht nicht, aber je mehr man damit arbeitet, umso mehr liebt man es :mrgreen:

Re: PBLexerGen + PBParserGen

Verfasst: 14.06.2012 00:15
von Blackskyliner
Mhm lecker... Theoretische Informatik :)

Aber cooles Teil, da kann man wenigstens in den Übungs und Vorlesungsbeispielen auch mal auf PB zurück greifen statt bison zu bemühen.

:allright:

Re: PBLexerGen + PBParserGen

Verfasst: 14.06.2012 00:37
von CSHW89
Cool danke für den Zuspruch ;)

Ich benutze es sogar schon in einem zweiten größeren Projekt, ein eigener OOP-PreCompiler. Funktioniert echt super, außer die Laufzeit des Generierens (nicht des Parsens!) ist noch etwas schlecht. Aber daran arbeite ich gerade.

lg Kevin

Re: PBLexerGen + PBParserGen

Verfasst: 10.02.2013 19:28
von cxAlex
Sieht extrem interessant aus, wenn ich es schaffe es so zu parametrieren wie ich es mir vorstelle könnte es mir viel Arbeit beim erstellen meines Cross - Compilers abnehmen: http://purebasic.fr/german/viewtopic.php?f=11&t=26382

Gruß, Alex

Re: PBLexerGen + PBParserGen

Verfasst: 11.02.2013 15:02
von CSHW89
Erstmal zum Verständnis: Wie soll denn dein Cross - Compiler arbeiten? So wie ich das verstehe, soll man doch die Möglichkeit haben, seine eigene Scriptsprache zu entwickeln, seine eigene Syntax ect... Aber was für ein Compiler willst du dann bauen? Du kennst ja die Syntax nicht. Also wie soll die Syntax vom Scriptsprachen-Ersteller übermittelt werden?

Zu meinem Programm: Die Generatoren sollten eigentlich nur vom Compilerschreiber benutzt werden. Also in deinem Fall von dir. Den fertigen Compiler benutzen dann halt die Benutzer. In deinem Fall also die Scriptsprachen-Ersteller, was aber nicht so Sinn macht, da sie ja ein Compiler speziell für ihre Scriptsprache brauchen.

Vielleicht verstehe ich da auch was Grundlegendes falsch.

lg Kevin

PS: Ich hab übrigens ne neue Version hochgeladen. Ist zwar schon etwas älter, hatte ich aber damals nicht mehr hochgeladen gehabt. Der Parser-Generator läuft erheblich schneller. Ich glaube bei komplexen Grammatiken war ein Zuwachs von 2000% (!) zu beobachten.