xtext hidden token

X

Xtext_starter

Gast
Hallo alle zusammen,
Ich habe eine Textdatei die ich auslesen möchte, habe auch schon eine Grammatik definiert die wunderbar funktioniert und das ganze in XML konvertiert. Jedoch habe ich in meiner Textdatei einige unwichtige Zeilen die ich den Parser ignorieren lassen möchte und versteh nicht wie ich das mit hidden token machen soll. Finde im Netz auch kein gutes Beispiel dazu.

bsp:

objekta = (objectb) []

als [] hab ich ein array in der grammatik definiert aber wie kann ich es vom parser ignorieren lassen wenn das array leer ist.

Danke im Voraus an jeden Helfenden.
 
S

Sebastian Z.

Gast
Hallo Xtext_starter,

Antworten auf Xtext-bezogene Fragen bekommst du am wahrscheinlichsten in der Xtext Newsgroup bei Eclipse.
Zeilen mit leeren Arrays komplett ignorieren kannst du mit Xtext wohl nicht - zumindest würde ich das anhand deines Beispiels so einschätzen. Aber vielleicht fragst du in der Newsgroup noch einmal nach und gibst noch ein paar mehr Informationen zu deiner Grammatik und den Eigenarten der Zeilen, die du überspringen möchtest?

Viele Grüße,
Sebastian
 

Wildcard

Top Contributor
Nein, dafür sind Hidden Tokens nicht gedacht. Mit Hidden Tokens werden zB Leerzeichen und Kommentare ignoriert, bzgw von der Domain Logik getrennt.
Warum möchtest du leere Arrays ignorieren?
 
X

Xtext_starter

Gast
Wie mache ich das sonst, also wie definiere ich eine Grammatik die mir alles andere was nicht definiert ist ignoriert. Weil ich sonst in der xml-Datei ziemlich viele leere Elemente habe und die brauche ich nicht. Wie könnte ich das sonst lösen wenn nicht mit HiddenTokens. Gibt es irgendwie eine Möglichkeit das nur die Dinge geparst werden die in der Grammatik definiert sind.
Also wenn ich beispielsweise eine Zeile habe:

blablablablabrauche ich nicht
(objekta){
inhalt a = 'nützlicher Wert',
inhalt b = <unnötig>,
inhalt c = (ArraydasLeeristUndNichtGebrauchtWird)[],
}

wie könnte ich das machen das am Ende in meiner XMLResource folgendes steht:
<objektA><inhaltA><nützlicherWert></inhaltA></objektA> also inhalt b und c komplett ignoriert wird und die erste Zeile da sie nicht geparst werden kann.
 

Wildcard

Top Contributor
Ich vermute mal es geht um die Grammatik von vor ein paar Tagen?
Der einfachste Weg ist IMHO nach dem Parsen über das Modell zu iterieren (z.B. mit eAllContents() ) und alles was du nicht haben möchtest zu löschen.
 
X

Xtext_starter

Gast
Hab jetzt folgenden Ansatz weiß aber nicht genau wonach ich suchen soll um es dann zu löschen und wenn ich ein Objekt einfach lösche führt das nicht zu einem Fehler wenn da eine Null-Referenz ist innerhalb eines Objektes?
Java:
Resource r = rs.getResource(uri, true);
EList<EObject> contents = r.getContents();
			
			for(EObject e: contents){
				TreeIterator<EObject> tree = e.eAllContents();
				while(tree.hasNext()){
					(
				}
			}
 
X

Xtext_starter

Gast
Gut also das mit den Hidden Tokens hat sich erledigt, hab einen anderen Weg gefunden.
Aber eine andere Sache ich bekomm anhand meiner Grammatik in meiner XMLResource dann folgende Ausgabe:
Java:
<contents xsi:type="myDsl:values" name="obj">
        <values xsi:type="myDsl:StringValue" value="ObjektA"/>
</contents>

Gibt es eine Möglichkeit das diese ganzen Informationen wie xsi:type usw weggelassen werden und ich am Ende
<obj>
<ObjektA>
</obj>
stehen habe?
 

Wildcard

Top Contributor
Die Möglichkeit die ich gezeigt habe war nur eine Variante um auf einfachste Weise auf von einer Text Datei auf 'irgendeine' XML Repräsentation zu kommen.
Wenn du eine ganz bestimmte Syntax haben möchtest, musst du entweder das von Xtext erzeugte Ecore mit EAnnotations für die XML serialisierung anreichern, oder du schreibst eine XSD mit der du dein XML Format repräsentierst.
Aus dieser XSD kannst du dann ein Ecore erstellen lassen. Danach hast du dann die Wahl entweder die Grammatik anzupassen damit sie dieses Ecore befüllt, oder du lässt die Grammatik wie sie ist und überführst das geparste Modell in dein XML Modell und speicherst dieses dann ab.
Wenn dein XML sehr einfach gestrickt ist, dann ist der einfachste Weg wahrscheinlich direkt XPand zu verwenden (eine Templatesprache). Wenn du ein neues Xtext Projekt anlegst ist dort sogar ein Beispiel zu finden (im generator Projekt) wie man mit Xtext + XPand einen 'Compiler' schreibt der eine textuelle Syntax in ein Zielformat überführt.
 
X

Xtext_starter

Gast
Vielen Dank erstmal für die Antwort, aber irgendwie bin ich jetzt total verwirrt. Ich habe jetzt 3 Projekte das eigentliche mit meiner DSL, ein .gen und .ui. Wo soll ich jetzt was machen. Brauche ich die anderen 2 Projekte.
 
X

Xtext_starter

Gast
Also die letzte Frage könnt ihr vergessen. Also mir scheint das alles viel zu unnötig. Ich möchte eigentlich nur dass statt
<objects xsi:type="myDsl:Array"> </objects> --> <Array></Array> diese ganzen xsi:type angaben brauche ich nicht. Gibt es da keine Eigenschaft im Ecore-Model beispielsweise label="asd" damit dann in der XMLResource steht <asd></asd>.
 

Wildcard

Top Contributor
Ich sag doch: wenn dir eine konkrete XML Struktur vorschwebt, dann schreib dir eine XSD und erzeuge das Ecore aus der XSD. Damit wird dann entsprechend der XSD serialisiert. Was ist daran unnötig? Eine XML Struktur wird anhand eines Schemas spezifiziert, das ist so Standard.
 
X

Xtext_starter

Gast
Also ich habe jetzt die unnötigen save-type-infos wegbekommen:
Java:
XMLSave.XMLTypeInfo typeInfo = new XMLSave.XMLTypeInfo() {
				public boolean shouldSaveType(EClass objectType, EClass featureType,
						EStructuralFeature feature) {
					return false;
				}
				public boolean shouldSaveType(EClass objectType, EClassifier featureType,
						EStructuralFeature feature) {
					return false;
				}
			};
			
			xmlResource.getDefaultSaveOptions().put(XMLResource.OPTION_SAVE_TYPE_INFORMATION, typeInfo);

Das mit der XSD versteh ich nicht so ganz, wie kann ich es abändern damit das Xml-tag aus dem objektnamen besteht und nicht aus <objekt name="asdad"> sondern <asdasd> hier ein auszug aus der xsd:
Java:
<xsd:element ecore:ignore="true" name="Model" type="myDsl:Model"/>
  <xsd:element ecore:ignore="true" name="AbstractObject" type="myDsl:AbstractObject"/>
  <xsd:element ecore:ignore="true" name="name" type="myDsl:name"/>
  <xsd:element ecore:ignore="true" name="Property" type="myDsl:Property"/>
  <xsd:element ecore:ignore="true" name="Value" type="myDsl:Value"/>
  <xsd:element ecore:ignore="true" name="StringValue" type="myDsl:StringValue"/>
  <xsd:element ecore:ignore="true" name="IntValue" type="myDsl:IntValue"/>
<xsd:complexType name="AbstractObject">
    <xsd:complexContent>
      <xsd:extension base="myDsl:Value"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType ecore:name="name" name="name">
    <xsd:complexContent>
      <xsd:extension base="myDsl:AbstractObject">
        <xsd:sequence>
          <xsd:element ecore:resolveProxies="true" maxOccurs="unbounded" minOccurs="0" name="contents" type="xsd:anyType"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="ecore:EString"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
 

Wildcard

Top Contributor
Wenn die möglichen Objektnamen nicht bekannt sind lässt sich die XML überhaupt nicht per Schema beschreiben. In dem Fall solltest du einfach XPand verwenden um eine XML Datei aus deinem Modell zu erstellen. Die Frage ist halt, wer soll das später einlesen und verarbeiten wenn du dein Format nicht mit einem Schema beschreiben kannst?
 
X

Xtext_starter

Gast
Gut werds irgendwie mit XPand probieren. Vielen Dank für die tolle Unterstützung Wildcard!!!! (Thema erledigt)
 

Neue Themen


Oben