Entwickler-Ecke
Sonstiges (.NET) - Generelle Frage zur Umsetzung eines Programms - SyntaxEditor
Joey86 - Di 15.06.10 20:51
Titel: Generelle Frage zur Umsetzung eines Programms - SyntaxEditor
Hi!
Ich hab mir hier
http://www.actiprosoftware.com/Products/DotNet/WPF/SyntaxEditor/Default.aspx mal ne 21-tägigie Trialversion heruntergeladen und möchte mich nun etwas damit beschäftigen, eine eigene Sprache mit SyntaxEditor zu schreiben.
Nun habe ich hier eine Klasse Auftrag und eine Klasse Lokation.
Das Attribut Empfänger der Klasse Auftrag ist vom Typ Lokation.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| class Auftrag class Lokation { { public Auftrag(){ } public Lokation(){ }
public int Datum; public string Land; public int Menge; public string Ort; public string Empfänger; } } |
Wie bekomme ich es nun hin bzw. wie müssen die Klassen aussehen, dass folgeder Aufruf später möglich ist:
C#-Quelltext
1:
| Auftrag.Empfänger.Land |
Ich möchte damit später erreichen, dass wenn ich
Auftrag. tippe, mir vom SyntaxEditor später die dazugehörigen Attribute angezeigt werden. Ich denke, dass ich das so umzusetzen hab.
Gruß
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Di 15.06.2010 um 21:03
Christian S. - Di 15.06.10 21:02
Joey86 hat folgendes geschrieben : |
| Das Attribut Empfänger der Klasse Auftrag ist vom Typ Lokation. |
Das Attribut, was kein Attribut sondern ein Feld ist, ist aber vom Typ String :gruebel:
Ansonsten würde ich mir angucken, wie das in den Beispielen, die der Komponente beiliegen, gelöst ist. Laut Webseite werden "Beispielsprachen" wie z.B. C# mitgeliefert.
Joey86 - Di 15.06.10 21:11
Christian S. hat folgendes geschrieben : |
| Das Attribut, was kein Attribut sondern ein Feld ist, ist aber vom Typ String :gruebel: |
Oh mein Gott. Das ist peinlich.^^
Die Beispiele hab ich schon recht fleißig mir angeschaut, die sind jedoch etwas dürftig. Ich denke ich werde den Thread noch für weitere Fragen nützen, wenn dann aber hoffentlich sinnvollere...
Joey86 - Mi 16.06.10 10:23
Ist es irgendwie möglich, die Namen meiner Klasse und die Namen der zugehörigen Felder in einem Dictionary zu speichern?
Ich bekomme nachher z.B. einen String Auftrag und möchte dann im Dictionary nachschauen können, ob Auftrag vorhanden ist und was darauf folgen kann, im Beispiel hier: Datum, Menge, Empfänger.
Wann, wo, wie lade ich das in mein Dict? Oder gibt es einen eleganteren Weg?
Grüße
danielf - Mi 16.06.10 10:39
Hallo,
es gibt im .NET Framework verschiedene Collection Typen (Vergleich
MSDN [
http://msdn.microsoft.com/en-us/library/system.collections%28VS.71%29.aspx]).
Welchen Typ du genau nimmst, ist abhängig davon ob sich die Collection öfters Ändern (neue Aufträge kommen dazu, fertige werden entfernt), ob du schnellen Lese/Schreibzugriff brauchst und vielen anderen Kritieren.
Der einfachste Fall ist ein Liste. Auf diese kannst du mittels Linq Abfragen abgeben. Ein Dictionary würde natürlich auch gehen, wäre aber doppelt gemoppelt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| List<Auftrag> auftraege = new List<Auftrag>(); Auftraege.Add(new Auftrag { Datum = 123 }; Auftraege.Add(new Auftrag { Datum = 133 }; var auftrag = (from a in auftraege where a.Datum = 133 select a).First<Auftrag>();
Dictionary<int, Auftrag> dictAuftraege = new Dictionary<int, Auftrag>(); dictAuftraege.Add(123, new Auftrag { Datum = 123 }; dictAuftraege.Add(133, new Auftrag { Datum = 133 };
var auftrag2 = dictAuftraege[133]; |
Auf den ersten Blick sieht ein Dictionary komfortabler aus. Es hat aber den (unnötigen) Nachteil, dass die Daten zweimal gespeichert werden und das du nur nach dem Schlüssel filtern kannst. Bei der List-Option kannst du deine Aufträge nach beliebigen Kritieren auswählen.
Gruß
Joey86 - Mi 16.06.10 16:41
Hi!
Erst einmal danke!
Das ist aber nicht ganz das, was ich gemeint habe bzw. brauche.
Ich versuch es mal genauer zu erläutern:
Also, es geht ja um meinen SyntaxEditor. Wenn ich mich in meinem Editor befinde und ein bestimmtest Wort (Schlüsselwort) eingebe und daraufhin den "." eingebe, soll daraufhin ein Fenster erscheinen, mit all den Typen, die nun darauf folgen können. Nun ist aber mein Problem, die richtigen Typen zu ermitteln. Beispielhaft habe ich ja die zwei Klassen hinzugefügt, allerdings falsch. Hier nochmal richtig:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| class Auftrag class Lokation { { public Auftrag(){ } public Lokation(){ }
public int Datum; public string Land; public int Menge; public string Ort; public Lokation Empfänger; } } |
Bisher dachte ich, ich versuche von den jeweiligen Klassen die Felder zu speichern mit ihren jeweiligen Typen, z.B. in einem Dictionary oder einer List. Dann schaue ich in das Dictionary und prüfe das Wort, das vor dem "." steht (String-Vergleich), damit ich weiß, was für Felder nun kommen können und liste diese dann in meiner IntelliPromptListe auf (das ist die Liste die zeigt, was nun gewählt werden kann).
Nun geht das aber leider nicht, wie ich mir das vorgestellt habe. Nach einer Lokation kann ein Land kommen und ein Ort, soweit richtig. Das kann ich so ja auch abspeichern. Nach Auftrag kann Datum, Menge, aber auch Empfänger folgen. Nur muss ich dann die Verbindung wieder hin zur Lokation abspeichern, oder? So dass ich nachher weiß, dass nach Auftrag entweder Datum, Menge oder Empfänger kommt. Und wenn ich Empfänger gewählt habe, ich wiederum Land und Ort zur Auswahl habe.
Wäre es vllt. sinnvoller, eine Klasse zu schreiben, die all meine möglichen Felder beinhaltet?
Ich bin euch dankbar, für jeden möglichen Verbesserungsvorschlag...
Würdet ihr das ganze ganz anders umsetzen?? Wäre mir auch recht...
Wichtig ist einfach nur, dass ich prüfen kann, ob es zu diesem Wort eine Klasse gibt und was daraufhin aufgerufen werden kann.
Grüße
Kha - Mi 16.06.10 19:40
Ich nehme an, mit Compilerbau hast du dich noch nicht groß beschäftigt? Könnte hilfreich sein ;) .
"Abspeichern" würde ich gar nichts, wenn ich dich richtig verstanden habe. Du musst immer den kompletten Pfad analysieren: Nach "A.B." suchst du nach einem Typ A und dann nach einem Member B dieses Typs und zeigst dann alle Member des Typs von B an.
Joey86 - Mi 16.06.10 21:19
Kha hat folgendes geschrieben : |
"Abspeichern" würde ich gar nichts, wenn ich dich richtig verstanden habe. |
Mir wurde gesagt, ich solls in ein Dictionary einlesen und gut ist. =/
Kha hat folgendes geschrieben : |
Du musst immer den kompletten Pfad analysieren: Nach "A.B." suchst du nach einem Typ A und dann nach einem Member B dieses Typs und zeigst dann alle Member des Typs von B an.
|
Mhh...mir ist nur nicht klar wie.
Kha - Mi 16.06.10 22:53
Das hat sich bei dir angehört, als ob du während des Parsens irgendeine Zwischenstruktur erstellen wolltest. Ganz am Anfang alle Metadaten auszulesen ist natürlich nicht verkehrt.
Stark vereinfacht könnte es etwa so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| class Assembly { public IDictionary<string, Type> Types { get; set; } }
class Type { public IDictionary<string, Field> Fields { get; set; } }
class Field { public string Name { get; set; } public Type Type { get; set; } } |
Bei "A.B." müssten dann alle
assembly.Types["A"].Fields["B"].Type.Fields angeboten werden.
Joey86 - Mi 23.06.10 13:20
Hi!
Konnte leider paar Tage nicht an den Rechner, daher die späte Antwort...
Leider sind mir paar Dinge nicht ganz klar.
- Warum IDictoinary? Also warum ein Interface?
- Mir ist nicht ganz klar, wie/wo ich in diesem Beispiel meine Dictionarys (Types + Fields) füllen würde.
Gruß
Joey86 - Do 24.06.10 18:54
Noch was von mir... =/
Mir wurde heute geraten, für die Aufgabe eine Klasse von Variablen zu schreiben.
Nur frage ich mich jetzt, was man darunter verstehen kann?
Könnt ihr mir da weiterhelfen?
Gruß & Dank
Kha - Do 24.06.10 20:24
Joey86 hat folgendes geschrieben : |
| - Warum IDictoinary? Also warum ein Interface? |
Hm, warum nicht ;) ?
Joey86 hat folgendes geschrieben : |
| - Mir ist nicht ganz klar, wie/wo ich in diesem Beispiel meine Dictionarys (Types + Fields) füllen würde. |
C#-Quelltext
1: 2: 3: 4:
| var assembly = new Assembly(); assembly.Types = new Dictionary<string, Type>(); assembly.Types["a"] = new Type(); ... |
Joey86 hat folgendes geschrieben : |
| Nur frage ich mich jetzt, was man darunter verstehen kann? |
Tut mir leid, keine Ahnung. Der Ausdruck ergibt keinen Sinn.
Joey86 - Fr 25.06.10 20:20
Bei mir gibts was neues. Sollte dafür jetzt doch eine Klasse schreiben für die verschiedenen Variablen.
Bin bislang soweit:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public class FieldDescription { public FieldDescription(string name, string displayName, int tokenID) { this.Name = name; this.TokenID = tokenID; this.Fields = new List<FieldDescription>(); }
public string Name { get; set; }
public int TokenID { get; set; }
public List<FieldDescription> Fields { get; set; } } |
Damit kann ich den verschiedenen Objekten meiner Klasse die verschiedenen Felder, die darauf folgen, zuweisen. Z.B.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| FieldDescription auftrag = new FieldDescription("Order", "Auftrag", SimpleTokenID.Number); auftrag.Fields.Add(new FieldDescription("Sender", "Sender", SimpleTokenID.Text)); auftrag.Fields.Add(new FieldDescription("Amount", "Menge", SimpleTokenID.Number)); auftrag.Fields.Add(new FieldDescription("Empfänger", "Acceptor", SimpleTokenID.Text));
FieldDescription location = new FieldDescription("Location", "Lokation", SimpleTokenID.Number); location.Fields.Add(new FieldDescription("Country", "Land", SimpleTokenID.Text)); location.Fields.Add(new FieldDescription("City", "Stadt", SimpleTokenID.Text)); |
Dadurch kann ich nun meinem Auftrag auch eine Lokation zufügen.
C#-Quelltext
1:
| auftrag.Fields.Add(location); |
Allerdings bräuchte ich jetzt in etwa sowas:
C#-Quelltext
1: 2:
| auftrag.Fields.Add("Sender", location); auftrag.Fields.Add("Empfänger", location); |
Da Sender und Empfänger vom Typ Lokation ist. In meiner Liste bekomm ich das jedoch aber nicht rein.
Wie kann ich das nun lösen?
Joey86 - So 27.06.10 19:27
Keiner ne Idee?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!