AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte GenPar - Ein [ziemlich] generischer Parser
Thema durchsuchen
Ansicht
Themen-Optionen

GenPar - Ein [ziemlich] generischer Parser

Ein Thema von Khabarakh · begonnen am 28. Mär 2006 · letzter Beitrag vom 12. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Khabarakh
Khabarakh
Registriert seit: 18. Aug 2004
(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
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 .

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
Moderator in der EE
 
Benutzerbild von arbu man
arbu man

 
Delphi 7 Professional
 
#2
  Alt 28. Mär 2006, 21:30
Ist das Normal das bei der Testseite ein Error ("Server Error in '/Khabarakh' Application.") kommt?
Björn
  Mit Zitat antworten Zitat
Daniel G
 
#3
  Alt 28. Mär 2006, 21:50
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.

Kommt bei mir übrigens auch.
  Mit Zitat antworten Zitat
Elvis

 
Delphi 2010 Professional
 
#4
  Alt 28. Mär 2006, 21:57
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
Angehängte Dateien
Dateityp: zip genpar_126.zip (24,0 KB, 18x aufgerufen)
Robert Giesecke
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#5
  Alt 29. Mär 2006, 13:24
@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.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#6
  Alt 29. Mär 2006, 19:20
AspSpider.com hat seine Probleme gelöst (höchstwahrscheinlich in Salzsäure), die Testseite ist wieder online .
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#7
  Alt 18. Apr 2006, 17:59
Wenn alles funktioniert, sagt niemand mehr etwas, toll .

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();
}
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber

 
Delphi XE Professional
 
#8
  Alt 18. Apr 2006, 18:06
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#9
  Alt 18. Apr 2006, 18:17
Das ging doch gestern Abend noch .
Egal, einfach nochmal alles hochgeladen.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber

 
Delphi XE Professional
 
#10
  Alt 18. Apr 2006, 18:18
Hi!

jetzt gehts auch!


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr.
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