PureBoard
http://forums.purebasic.com/german/

PBLexerGen + PBParserGen
http://forums.purebasic.com/german/viewtopic.php?f=11&t=25354
Seite 1 von 2

Autor:  CSHW89 [ 18.03.2012 21:37 ]
Betreff des Beitrags:  PBLexerGen + PBParserGen

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


Parser.pb:
Code:
%token NUMBER
%left '+' '-'
%left '*' '/'

%type eval exp
%start eval

%%

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


Main.pb:
Code:
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

Autor:  ts-soft [ 18.03.2012 22:08 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

:allright:
Aber für sowas bin ich zu dumm :wink:

Autor:  Frabbing [ 19.03.2012 20:51 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

Ich leider auch. Sehe da irgendwie keinen Vorteil. :shock:

Autor:  DrShrek [ 19.03.2012 21:26 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

Gibt ja schon Lex und Yacc.
Was ist also an Deinen Lexer/Parser besser?

Autor:  NicTheQuick [ 19.03.2012 21:47 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

DrShrek hat geschrieben:
Gibt ja schon Lex und Yacc.
Was ist also an Deinen Lexer/Parser besser?

Er erstellt PB-Code?

Autor:  CSHW89 [ 19.03.2012 23:42 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

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:

Autor:  Blackskyliner [ 14.06.2012 00:15 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

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:

Autor:  CSHW89 [ 14.06.2012 00:37 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

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

Autor:  cxAlex [ 10.02.2013 19:28 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

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: viewtopic.php?f=11&t=26382

Gruß, Alex

Autor:  CSHW89 [ 11.02.2013 15:02 ]
Betreff des Beitrags:  Re: PBLexerGen + PBParserGen

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.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/