2016-01-18 4 views
5

Ich schreibe einen SVG-Parser, hauptsächlich als Übung, um zu lernen, wie man Parsec benutzt. Derzeit bin ich mit den folgenden Datentyp meiner SVG-Datei dar:SVG-Parsing und Datentyp

data SVG = Element String [Attribute] [SVG] 
     | SelfClosingTag [Attribute] 
     | Body String 
     | Comment String 
     | XMLDecl String 

Das funktioniert ganz gut, aber ich bin nicht sicher über die Element String [Attribute] [SVG] Teil meiner Datentyp. Da es nur eine begrenzte Anzahl von möglichen tags für ein SVG gibt, habe ich darüber nachgedacht, einen Typ zu verwenden, um ein SVG-Element darzustellen, anstatt einen String zu verwenden. Etwas wie dieses:

data SVG = Element TagName [Attribute] [SVG] 
     | ... 

data TagName = A 
      | AltGlyph 
      | AltGlyphDef 
      ... 
      | View 
      | Vkern 

Ist es eine gute Idee? Was wären die Vorteile, dies zu tun, wenn es welche gibt? Gibt es eine elegantere Lösung?

Antwort

4

Ich persönlich bevorzuge den Ansatz der Aufzählung aller möglichen TagName s. Auf diese Weise kann der Compiler Ihnen Fehler und Warnungen geben, wenn Sie irgendwelche leichtsinnigen Fehler machen. Wenn ich zum Beispiel eine Funktion schreiben möchte, die jeden möglichen Typ von Element abdeckt, dann kann der Compiler, wenn jeder Typ in einem ADT aufgelistet ist, Ihnen nicht erschöpfende Übereinstimmungswarnungen geben. Wenn Sie es als String darstellen, ist dies nicht möglich. Wenn ich einen Element eines bestimmten Typs zuordnen und versehentlich TagName falsch schreiben möchte, wird der Compiler es außerdem abfangen. Ein dritter Grund, der wahrscheinlich nicht wirklich hier zutrifft, aber im Allgemeinen erwähnenswert ist, dass, wenn ich später beschließe, eine Variante von TagName hinzuzufügen oder zu entfernen, dann wird der Compiler mir jeden Ort mitteilen, der geändert werden muss. Ich bezweifle, dass dies für SVG-Tag-Namen passieren wird, aber im Allgemeinen ist es etwas zu beachten.

4

Um Ihre Frage zu beantworten:

Sie können auf diese Weise tun entweder je nachdem, was Sie mit Ihrem Parse-Baum zu tun, nachdem Sie es machen wollen.

Wenn alles, was Sie mit Ihnen zu tun haben SVG Parser beschreiben die Form der SGV-Daten, Sie sind nur fin mit einer Zeichenfolge.

Auf der anderen Seite, wenn Sie diese SVG-Daten irgendwie in etwas wie eine Grafik umwandeln möchten (das Sie erwarten, Ihren AST zu bewerten), werden Sie feststellen, dass es am besten ist, alle semantischen Informationen im Typsystem darzustellen. Es wird die nächsten Schritte viel einfacher machen.

Die Frage in meinem Kopf ist, ob der Parsing Pass genau der Ort ist, um das zu erreichen. (Vollständige Offenlegung, ich habe nur eine vorübergehende Vertrautheit mit SVG.) Ich vermute, dass eher als nur eine flache Liste von Tags, Sie wären besser mit Element jeder mit seinen eigenen Satz von erforderlichen und optionalen Attributen. Wenn diese Umwandlung später im Programm stattfindet, muss kein TagName Datentyp erstellt werden. Sie können alle Typfehler gleichzeitig mit dem Zusammenführen der Attribute in die Element s abfangen.

Zum anderen könnte ein gutes Argument in diesem Fall gerade zu einem vollständigen Element Baum zu analysieren vorgenommen werden, habe ich die allgemeine [Attribute] und [SVG] Felder des Element Konstruktor fallen würde und stattdessen dafür vorgesehenen Felder in Ihrem TagName Konstruktor machen.


Eine andere Antwort auf die Frage, die Sie nicht gefragt hat:

Put Quellcode Standort in Ihren frühen Parse-Baum.Aus persönlicher Erfahrung kann ich Ihnen sagen, dass es schwieriger wird, je größer Ihr Programm wird.