![]() |
GenPar - Ein [ziemlich] generischer Parser
Assembly: GenPar.dll Root-Namespace: Kha.GenPar .NET-Version: 2.0.50727 Größe: 40,0 KB Signed
Code:
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:
cos(e * 12) / (2 * (e * 6,28 + 1))
Code:
(Default-Expression der Testseite)
(!Hugo xor pi > e ? cos(e * 12) / (2 * (e * 6,28 + 1)) : log(a; 3)) ^ 3 * 21 / 32
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:
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: .
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); } } } 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 -.-) ![]() |
Re: GenPar - Ein [ziemlich] generischer Parser
Ist das Normal das bei der Testseite ein Error ("Server Error in '/Khabarakh' Application.") kommt?
|
Re: GenPar - Ein [ziemlich] generischer Parser
Zitat:
Kommt bei mir übrigens auch. |
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: |
Re: GenPar - Ein [ziemlich] generischer Parser
@arbu & Daniel: Bei mir kommt zwar seit heute "Service Unavailable", sollte aber den gleichen
![]() @Elvis: Danke, an das ganze Gerempel habe ich gar nicht mehr gedacht. |
Re: GenPar - Ein [ziemlich] generischer Parser
AspSpider.com hat seine Probleme gelöst (höchstwahrscheinlich in Salzsäure), die Testseite ist wieder online :D .
|
Re: GenPar - Ein [ziemlich] generischer Parser
Wenn alles funktioniert, sagt niemand mehr etwas, toll :P .
Version 1.1.2298.22751 ^^
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(); } |
Re: GenPar - Ein [ziemlich] generischer Parser
Hi!
Und täglich grüßt der Server-Fehler oder wie? ;) Bei mir geht die Testseite nicht... Zitat:
Ciao Frederic |
Re: GenPar - Ein [ziemlich] generischer Parser
Das ging doch gestern Abend noch :gruebel: :stupid: .
Egal, einfach nochmal alles hochgeladen. |
Re: GenPar - Ein [ziemlich] generischer Parser
Hi!
jetzt gehts auch! :thumb: Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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