Parser und Tokentree



  • Hallo zusammen,

    ich arbeite mich gerade in die Welt der Sprachen und Compiler ein. Ich habe bereits einen funktionsfähigen Parser für eine relativ komplexe C ähnliche Sprache gebaut, nur bin ich derzeit mit dem handling von den Tress nicht zufreiden.

    Ich habe das der performance wegen in eine Linked-List structure erzeugt, die allerdings unheimlich schwer zu überwachen ist, gerade wenn zwischendurch Tokens zerstört werden oder der komplette Tree zerstört werden soll aber einzelne Tokens weiterbenutzt werden.

    typedef struct ext Token
    	{
    		public:
    			bool disposed;
    			TokenType::TYPE Type;
    
    			union
    			{
    				struct
    				{
    					const char* First;
    					const char* Last;
    
    					unsigned long Index;
    				}IndexValue;
    				struct
    				{
    					const char* First;
    					const char* Last;
    				}Value;
    				unsigned long Index;
    			};
    
    			Token* Next;
    
    			Token();
    			~Token();
    
    			void AddNode(TokenType::TYPE type);
    			void AddNode(TokenType::TYPE type, unsigned long index);
    			void AddNode(TokenType::TYPE type, const char* first, const char* last);
    			void AddNode(TokenType::TYPE type, const char* first, const char* last, unsigned long index);			
    
    			void Dispose();
    	}Token;
    

    Ich wollte das jetzt etwas einfacher gestalten, tu mich aber mit dem Ansatz dafür schwer. Die Tokens sind mommentan so aufgebaut, dass es grundsätzlich immer einen Index gibt welcher die aktuelle Position im Stream definiert, da ich nur auf iostreams arbeite. Die Pointer char* stammen noch aus frühen experimenten, werden aber entweder für zusätzliche Informationen über das Token (z.b. eine dynamische Erweiterung eines Datentyps, zum Abspeichern von Steuerzeichen) oder eben als Anfang und Ende eines Identifiers im Stream verwendet. Next gibt den nächsten Token in der Liste an.

    Der Quellcode ist rein experimentell und sieht daher so aus wie er aussieht, für optimierungen und die "Regeln der Kunst" ist hinterher noch zeit!

    Habt ihr irgendwelche Vorschläge für einen besseren Ansatz?
    std::vector habe ich deshalb nicht genommen weil der Code möglichst performant sein sollte.

    Beste Grüße und schönen Dank schonmal für etwaige Hilfe 🙂



  • Shaarigan schrieb:

    Ich habe das der performance wegen in eine Linked-List structure erzeugt

    🤡 🤡 🤡



  • Mich würden die Profiling-Ergebnisse interessieren, die dich dazu bewegt haben, eine selbst implementierte Linked List anstatt des vectors zu nehmen. Hast du diese zufällig noch da?



  • @Shaarigan
    Dir ist schon klar dass ext ein beschissener Name für dein __declspec(dllexport) Makro ist, ja?
    Und dass du das typedef in typedef struct in C++ überflüssig ist...


Anmelden zum Antworten