Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   GenPar - Ein [ziemlich] generischer Parser (https://www.delphipraxis.net/66351-genpar-ein-%5Bziemlich%5D-generischer-parser.html)

Khabarakh 28. Mär 2006 21:23


GenPar - Ein [ziemlich] generischer Parser
 
(Für alle ohne Framework (und natürlich auch alle anderen) gibt es hier eine Testseite)
GenPar

Assembly: GenPar.dll
Root-Namespace: Kha.GenPar
.NET-Version: 2.0.50727
Größe: 40,0 KB
Signed

Code:
cos(e * 12) / (2 * (e * 6,28 + 1))
Ein mathematischer Ausdruck, wie wir ihn lieben (oder auch nicht) und wie er von tausenden Parsern auf der ganzen Welt zerlegt werden kann. Ergo: Langweilig :zwinker:
Code:
(!Hugo xor pi > e ? cos(e * 12) / (2 * (e * 6,28 + 1)) : log(a; 3)) ^ 3 * 21 / 32
(Default-Expression der Testseite)
Hui, langsam wird es schon etwas außer- und ungewöhnlicher. Aber generisch ist daran noch nichts, das wird es erst beispielsweise mit so etwas:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using Kha.GenPar; // enthält allgemeine Typen wie Variablen oder Basisklassen
using Kha.GenPar.Infix; // enthält den Infixparser und Zugehöriges
using System.Reflection;

namespace ConsoleApplication1
{
   class Program
   {
      interface IGreatForum { } // Ein Forum ist einfach toll, das braucht keine Methoden ;)
      class DP : Object, IGreatForum { } // s.o ^^

      // Fangen wir gleich mal mit dem Ergebnis an, sonst wird es langweilig ;)
      static void Main(string[] args)
      {
         InfixParser parser = new InfixParser();
         // sucht in der angegebenen Klasse nach Parsertypen
         // (= Methoden mit Ableitungen von ParserAttribute)
         parser.RegisteredTypes.IncludeTypes(typeof(Program));
         // und noch eine Variable
         parser.RegisteredTypes.Variables.Add(new Variable(typeof(IGreatForum), "great"));

         parser.Parse("DP is great");
         Console.WriteLine(parser.Root.Evaluate());
         Console.ReadLine();
      }
      // Das Ergebnis versteht sich wohl von selbst :P

      // Und nun die Interna:

      // enthält alle in der Assembly definierten Typen
      static List<Type> classList = new List<Type>(Assembly.GetCallingAssembly().GetTypes());

      // Definieren wir mal schnell ein Literal...
      // God bless attributes
      //
      // Parst einen Typenbezeichner im String und gibt ein Type-Objekt zurück
      [SimpleLiteral()]
      public static Type ToType(string s, out int length, out bool succeeded)
      {
         foreach (Type t in classList)
            if (s.StartsWith(t.Name)) {
               length = t.Name.Length;
               succeeded = true;
               return t;
            }
         length = 42; // total egal, da succeeded eh false ist
         succeeded = false;
         return null;
      }

      // Und noch einen Operator
      // Meine Einstellung zu Attributen habe ich ja schon kundgegeben
      // 110 = Operatorvorrang (bei einem einzigen Operator ziemlich egal
      // \a = Argument
      [InfixOperator(110, @"\a is \a")]
      public static bool Is(Type t1, Type t2)
      {
         return t2.IsAssignableFrom(t1);
      }
   }
}
Hmm. Wir haben sozusagen einen komplett neuen Parser geschrieben, und das mit genau 64 Zeilen, von denen die meisten aus Kommentaren bestehen. Nicht schlecht, würde ich mit wenigstens einem kleinem Bisschen Eigenlob sagen :angel2: .

Zum Sourcecode: Da ich eigentlich nur OS-Projekte schreibe und die Assembly sowieso unter der GPL steht, ich gleichzeitig aber die erste verwendbare Version sofort ins Netz stellen wollte, ist der Sourcecode an manchen Stellen noch etwas - nun ja - "inoptimal" ;) . Zur Lektüre würde ich also lieber auf eine der nächsten Versionen warten, morgen werde ich mal FxCop drüberlaufen lassen. Wie gesagt, er läuft, aber in den nächsten Versionen wird das Ganze noch einmal um Einiges generischer werden (-> Plugins). Es sei mir verziehen, wenn man Stellen durch C# oder das Framework eigentlich viel eleganter hätte schreiben können, ich sharpe (^^) (leider) erst seit einem halben Jahr. Achja, irgendwelche Form von Doku lässt auch noch bis zur nächsten Version auf sich warten ;) .

TODO (nicht vollständig, einfach alles, was mir im Moment einfällt):

- Vektoren
- Komplexe Zahlen
- Ein UPN-Parser
- Ein Operator-Browser
- generische Variablen/Konstanten
- Ein Precompiler (konstante Teile des Ausdrucks)
- Optimierungen
- IL-Compiler (Reflection = schnarch)

(Wahrscheinlich wieder die Hälfte vergessen -.-)

GenPar.zip

arbu man 28. Mär 2006 21:30

Re: GenPar - Ein [ziemlich] generischer Parser
 
Ist das Normal das bei der Testseite ein Error ("Server Error in '/Khabarakh' Application.") kommt?

Daniel G 28. Mär 2006 21:50

Re: GenPar - Ein [ziemlich] generischer Parser
 
Zitat:

Zitat von arbu man
Ist das Normal das bei der Testseite ein Error ("Server Error in '/Khabarakh' Application.") kommt?

Eine Exception ist wohl selten normal. :zwinker:

Kommt bei mir übrigens auch.

Elvis 28. Mär 2006 21:57

Re: GenPar - Ein [ziemlich] generischer Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Solution und das Projekt sind noch ein wenig gaga. ;)
Ich habe sie mal bereinigt angehängt ;)
lol, nu habe ich die R# Temps mit reingeworfen :lol:

Khabarakh 29. Mär 2006 13:24

Re: GenPar - Ein [ziemlich] generischer Parser
 
@arbu & Daniel: Bei mir kommt zwar seit heute "Service Unavailable", sollte aber den gleichen Ursprung haben. Naja, bei einem kostenlosen ASP.Net-Hoster kann man sich wirklich nicht beschweren, auch wenn es etwas ungelegen kam ;) .

@Elvis: Danke, an das ganze Gerempel habe ich gar nicht mehr gedacht.

Khabarakh 29. Mär 2006 19:20

Re: GenPar - Ein [ziemlich] generischer Parser
 
AspSpider.com hat seine Probleme gelöst (höchstwahrscheinlich in Salzsäure), die Testseite ist wieder online :D .

Khabarakh 18. Apr 2006 17:59

Re: GenPar - Ein [ziemlich] generischer Parser
 
Wenn alles funktioniert, sagt niemand mehr etwas, toll :P .

Version 1.1.2298.22751 ^^
  • Hab mal mit der Dokumentation angefangen, der Attributes-Ordner ist soweit fertig.
  • Alle Exceptions sind ab nun lokalisiert (deutsch + englisch).
  • MethodLiteral-Klasse: ziemlich ähnlich wie SimpleLiteralAttribute, aber weniger Reflection (in alle Standard-Packages eingebaut).
  • DefiningOperatorsAttribute-Klasse: Alle selbstdefinierten Operatoren ("operator XYZ") werden automatisch in den Parser übernommen.
  • Noch ein paar neue InfixOperatorAttribute-ctors
  • Komplexe Zahlen (Complex(Package)) und Vektoren (Vector2(Package), Vector3(Package))
Ein kleiner Bleistift zu den 3D-Vektoren:
Code:
static void Main(string[] args)
{
   InfixParser parser = new InfixParser(new Vector3Package());
   parser.Parse("(1; 0; 0) x (0; 2; 0)");
   Console.WriteLine(parser.Root.Evaluate());
   Console.ReadLine();
}

fkerber 18. Apr 2006 18:06

Re: GenPar - Ein [ziemlich] generischer Parser
 
Hi!

Und täglich grüßt der Server-Fehler oder wie? ;)
Bei mir geht die Testseite nicht...

Zitat:

Server Error in '/Khabarakh' Application.
--------------------------------------------------------------------------------

Culture 'de' is a neutral culture. It cannot be used in formatting and parsing and therefore cannot be set as the thread's current culture.

Ciao Frederic

Khabarakh 18. Apr 2006 18:17

Re: GenPar - Ein [ziemlich] generischer Parser
 
Das ging doch gestern Abend noch :gruebel: :stupid: .
Egal, einfach nochmal alles hochgeladen.

fkerber 18. Apr 2006 18:18

Re: GenPar - Ein [ziemlich] generischer Parser
 
Hi!

jetzt gehts auch! :thumb:


Ciao Frederic

arbu man 12. Aug 2006 16:46

Re: GenPar - Ein [ziemlich] generischer Parser
 
Wirklich ein cooler Parser :thumb: wenn ich das richtig verstanden habe kann der mit complexen zahlen rechnen oder ?

Gibt es eine möglich keit den Parser in Win32 zu nutzen ?

faux 12. Aug 2006 17:01

Re: GenPar - Ein [ziemlich] generischer Parser
 
Zitat:

Zitat von arbu man
Gibt es eine möglich keit den Parser in Win32 zu nutzen ?

Ich tippe mal auf nein; außer du übersetzt ihn. ;)
.NET ist normalerweise nicht Win32 portabel.

Grüße
Faux

Khabarakh 12. Aug 2006 17:08

Re: GenPar - Ein [ziemlich] generischer Parser
 
Zitat:

Zitat von arbu man
Wirklich ein cooler Parser :thumb: wenn ich das richtig verstanden habe kann der mit complexen zahlen rechnen oder ?

Selbst wenn er es nicht könnte, könntest du es ihm in 5 Minuten beibringen ;) .

Zitat:

Gibt es eine möglich keit den Parser in Win32 zu nutzen ?
Gäbe es, aber mit der Generizität ist dann weitgehend Schluss. Du könntest beispielsweise (in einer .Net-Sprache) einen Wrapper zum Parsen von komplexen Zahlen schreiben und diesen dann als COM-Klasse registrieren.

[add=Roter, nichtexistenter Kasten]
Zitat:

Zitat von faux
Ich tippe mal auf nein; außer du übersetzt ihn. ;)

Selbst wenn man nur einen kleinen Teil der generischen Features übersetzen würde, wäre das Ergebnis wohl nicht sehr brauchbar, aber ziemlich hässlich ;) .
[/add]

faux 12. Aug 2006 17:20

Re: GenPar - Ein [ziemlich] generischer Parser
 
Zitat:

Zitat von Khabarakh
Selbst wenn man nur einen kleinen Teil der generischen Features übersetzen würde, wäre das Ergebnis wohl nicht sehr brauchbar, aber ziemlich hässlich ;) .

:lol:
Aber ich dachte, das ist für .NET 1.1 geschrieben. :gruebel:
Zitat:

Zitat von Khabarakh
Version 1.1.2298.22751 ^^

Grüße
Faux

Khabarakh 12. Aug 2006 21:27

Re: GenPar - Ein [ziemlich] generischer Parser
 
Das ist doch nur die Assemblyversion. Wobei ein Umbau für 1.1 kein allzu großes Problem wäre, jedenfalls nichts im Vergleich zu 2.0 -> Win32 ;) . Generics werden nur zur Erleichterung benutzt, noch nicht beim Parsen.

[add]Jetzt verstehe ich erst, wie du zu der Aussage
Zitat:

Zitat von faux
Aber ich dachte, das ist für .NET 1.1 geschrieben. :gruebel:

kommst. Mit generischen Features meinte ich keine generischen Klassen, sondern eben das generische Konzept des Parsers. Und an diesem Punkt wird man schon wegen einer fehlenden Basisklasse aller Typen unter Win32 verzweifeln.
[/add]

faux 12. Aug 2006 23:50

Re: GenPar - Ein [ziemlich] generischer Parser
 
Zitat:

Zitat von Khabarakh
Mit generischen Features meinte ich keine generischen Klassen, sondern eben das generische Konzept des Parsers.

:wall:
Jetzt verstehe ich... ;)

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz