Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.
Seite 1 von 2  1 2      

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