| Autor |
Beitrag |
Joey86
      
Beiträge: 56
|
Verfasst: Di 15.06.10 20:51
Hi!
Ich hab mir hier www.actiprosoftware....xEditor/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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Joey86 
      
Beiträge: 56
|
Verfasst: 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  |
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 
      
Beiträge: 56
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 16.06.10 10:39
Hallo,
es gibt im .NET Framework verschiedene Collection Typen (Vergleich MSDN).
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 
      
Beiträge: 56
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 56
|
Verfasst: Mi 16.06.10 21:19
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 56
|
Verfasst: 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 
      
Beiträge: 56
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 24.06.10 20:24
|
|
Joey86 
      
Beiträge: 56
|
Verfasst: 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 
      
Beiträge: 56
|
Verfasst: So 27.06.10 19:27
|
|
|