telos hat aufgrund ihrer vielseitigen Ausrichtung häufig die Anforderung, maßgeschneiderte Compiler oder Interpreter zu entwerfen, die nicht nur die handelsüblichen oder frei verfügbaren Funktionalitäten abbilden. Sie finden ihren Einsatz überall dort, wo aufgrund von Kundenvorgaben ein speziell definierter Funktionsumfang abzudecken ist.

Der nachfolgende Artikel soll daher einen kleinen Überblick über die Grundlagen des telos® Compilerbaus bieten. Anhand eines einfachen Beispiels werden einige der vielfältigen Möglichkeiten beim Entwurf von Compilern/Interpretern dargestellt, um dem Leser eine kleine Einführung in dieses Themengebiet zu ermöglichen. Das beschriebene Beispiel steht mit allen notwendigen Source-Files am Ende des Artikels zum Download bereit.

Selbstverständlich stehen wir Ihnen gerne zur Verfügung, wenn Sie darüber hinaus größere Anwendungen planen und daher nach einem Kooperationspartner suchen. Durch unsere umfassende Erfahrung auf dem Gebiet der Compilerentwicklung sind wir in der Lage, Sie bei Ihren Entwicklungsprojekten optimal zu unterstützen. Bitte sprechen Sie uns an, wir beraten Sie gern.

Übersicht

Einleitung

Jedes Computerprogramm besteht zunächst aus nicht mehr, als aus einer Anordnung von Zeichen. Es können dabei u.a. Buchstaben, Zahlen, mathematische Operatoren (+,-,*, usw.), Satzzeichen (Punkt, Komma, Semikolon usw.) und andere Spezialzeichen wie K...

Semantik und Grammatik

Semantik Die Semantik befaßt sich mit dem Inhalt und der Bedeutung von Sprache bzw. von sprachlichen Zeichen. Die Semantik ordnet den Wörtern der Sprache somit eine Bedeutung zu. Sie beschreibt, wie komplexe Begriffe aus einfachen Begriffen abgeleitet w...

Produktion, Reduktion, Konflikte

Produktion Zur Produktion wird von einem Nicht-Terminal-Symbol, das auch als Startsymbol bezeichnet wird, ausgegangen. Dieses Startsymbol, das die linke Seite einer definierten Grammatik-Regel beschreibt, wird anhand dieser Regeln durch eine passende...

Compiler/Interpreter

Ein Compiler ist ein Programm, das einen Text einer Quellsprache in den Text einer Zielsprache übersetzt. Die Zielsprache entspricht i.d.R. dem Maschinencode des zugehörigen Computers. Der Prozeß der Übersetzung erfolgt dabei häufig in mehreren Stuf...

Scanner, Parser, CodeGenerator

Scanner Ein Scanner löst das sog. Wortproblem, indem er aus Lexemen Wörter zusammensetzt. Die Wörter (Befehle) einer Quelldatei werden während der lexikalischen Phase einer sog. lexikalischen Analyse unterzogen. Dazu werden die Wörter des Eingangsstroms, die ...

Lex und Yacc

Lex Lex (Flex) ist ein Tool zur Generierung von Scannern, die lexikalische Muster in Texten identifizieren können. In einem ersten Schritt werden Zeichenketten (Strings) eines Source-Codes in Token konvertiert. Durch die Verwendung von sog. regulären A...

Lex, Yacc und C++

Wie oben bereits angedeutet, sind Lex und Yacc die wohl bekanntesten Compilerbauwerkzeuge. Diese Programme wurden in den 70er Jahren entwickelt und sind heute auf nahezu allen Rechnerplattformen verfügbar. Altersbedingt unterstützen sie allerdings m...

Vorbereitungen

Es gibt eine Reihe unterschiedlicher Implementierungen der Lex und Yacc Tools. Flex und Bison heißen die GNU-Varianten, die auch für dieses Projekt verwendet werden, da sie auf den meisten Entwicklungssystemen frei verfügbar sind und ansonsten ko...

Der Scanner

Der Scanner erkennt einzelne Wörter und Symbole und gibt diese in Form von Rückgabewerten an den Parser. Daneben liefert er jedoch auch Werte für Bezeichner und Konstanten, die später weiterverarbeitet werden. In dem Beispiel sind diese Werte ber...

Die Grammatik

Hier sind der Kreativität kaum Grenzen gesetzt. Für dieses Beispiel wird eine eher schlanke Version implementiert, die aber bei Bedarf beliebig erweiterbar ist. Folgende Operatoren und Ausdrücke sind zur Zeit implementiert: Addititon (+) Subtraktion (-...

Der Syntaxbaum

Im wesentlichen besteht diese Datenstruktur aus zwei Komponenten: einer Klasse (Expression) und einer STL-Vektor-Tabelle (ExpressionList). Beide Komponenten wurden im obigen Beispiel zur Grammatik bereits kurz erläutert. Die Klasse (Expression) hat ...

Der Interpreter

Der eigentliche Vorteil einer Verwendung von C++ im Zusammenhang mit Lex und Yacc zeigt sich, sobald man die erzeugten Datenstrukturen tatsächlich verwenden möchte. Das Modul (interpret.cpp) implementiert die calc-Methode der Klasse (Expression). D...

Flex und Bison

In Abbildung 2 wird der Einsatz von Flex und Bison für das vorliegende Beispiel noch einmal verdeutlicht. Neben der Verwendung von notwendigen Dateien für Bison (easypars.yy) und Flex (easyscan.l) werden die selbsterstellten Header-Module (ast.h, g...

Beispielcode

In dem herunterladbaren Zip-File sind alle erforderlichen Source-Files enthalten. Wie bereits beschrieben, ruft das Makefile den Gcc-Compiler auf. Dieser muß demnach vorab auf dem Rechner installiert werden. Für Windows-Systeme bietet sich dazu d...