# xtext hidden token



## Xtext_starter (15. Sep 2010)

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.


----------



## Sebastian Z. (15. Sep 2010)

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 (15. Sep 2010)

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?


----------



## Xtext_starter (15. Sep 2010)

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 (15. Sep 2010)

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.


----------



## Xtext_starter (15. Sep 2010)

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?

```
Resource r = rs.getResource(uri, true);
EList<EObject> contents = r.getContents();
			
			for(EObject e: contents){
				TreeIterator<EObject> tree = e.eAllContents();
				while(tree.hasNext()){
					(
				}
			}
```


----------



## Xtext_starter (16. Sep 2010)

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:

```
<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 (17. Sep 2010)

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.


----------



## Xtext_starter (20. Sep 2010)

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.


----------



## Xtext_starter (20. Sep 2010)

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 (20. Sep 2010)

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.


----------



## Xtext_starter (21. Sep 2010)

Also ich habe jetzt die unnötigen save-type-infos wegbekommen:

```
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:

```
<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 (21. Sep 2010)

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?


----------



## Xtext_starter (21. Sep 2010)

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


----------

