Systemnähes Programmierung: compiler
Go to file
Skia b06785f4b7 Last stuff found in my worktree
The git hook seems to tell me it's building, but I don't know what
works and what doesn't.
2020-09-24 18:50:32 +02:00
Automat Restucture the whole project! 2014-06-02 20:59:58 +02:00
Buffer Fix a small bug in the Buffer 2014-06-03 14:24:54 +02:00
docs Some cleanups and some new dirs 2014-05-30 20:51:59 +02:00
includes Improve array function, and some shit in Makefiles 2014-06-04 13:03:19 +02:00
Parser Last stuff found in my worktree 2020-09-24 18:50:32 +02:00
Scanner Improve array function, and some shit in Makefiles 2014-06-04 13:03:19 +02:00
Symboltable Still some organizing: everything compile well! 2014-06-02 22:00:15 +02:00
testfiles/Scanner Fix a small bug in the Buffer 2014-06-03 14:24:54 +02:00
makefile Improve array function, and some shit in Makefiles 2014-06-04 13:03:19 +02:00
readme.txt Move the entire interface-design to readme.txt (my eyes, just get it away) 2014-04-21 13:59:25 +02:00

/*
===========================================================================

MAKEFILE STUFF

===========================================================================
*/

Das Projekt wurde in 4 Teilprojekte aufgeteilt:

	- Automat
	- Buffer
	- Symboltabelle
	
	- Scanner
	

Jedes Teilprojekt hat die Verzeichnisstruktur:
	- debug		enthaelt Objektfiles zum Testen
	- lib		enthaelt Objektfiles zum Erstellen der shared library des Teilprojekts
	- src		enthaelt den Source-Code

	jedes Teilprojekt enthaelt ein eigenes Makefile und eine eigene Main-Klasse, um die Funktionalitaet zu testen.
	
Level: ohne Makefile Kenntnisse	
Im Makefile im Teilprojekt Automat sind alle Schritte zum Compilieren und Linken ausfuehrlich aufgelistet.


Level: wenig Makefile-Kenntnisse
Im Makefile im Teilprojekt Buffer werden die benoetigten Verzeichnisse ueber Variablen definiert.


Level: gute Makefile-Kenntnisse
Im Makefile im Teilprojekt Symboltabelle und Scanner wird auch die Liste der Abhaengigkeiten ueber Variablen deklariert
Aufbau des Makefiles:
	Definition der Variablen
	Targets zum Bauen des Tests
	Targets zum Erstellen der shared library
	


Das Makefile im obersten Projekt-Verzeichnis loescht alle shared libraries und erstellt alle neu.


In der View "Make Targets" erscheinen die Targets der einzelnen Makefiles, die dann mit einem Doppelklick ausgefuehrt werden können.


Aufbau der Targets

# 	 target: dependencies
# 	 [tab] system_command


# Compilation commands:
#    classA.o: classA.cpp
#    [tab] g++ -c classA.cpp -o classA.o
    
#    classB.o: classB.cpp
#    [tab] g++ -c classB.cpp -o classB.o


# Link command:
#    my_program: classA.o classB.o
#    [tab] c++ classA.o classB.o -o my_program

# options:
#		-c			Kompilieren ohne zu linken. 
#		-g 			debugging infos erzeugen
#		-o file     object-file file erzeugen 
#
#       -fPIC		position independant code wichtig für shared library

Zum Ausfuehren der Programme muss der LD_LIBRARY_PATH noch folgendermaßen gesetzt werden:
m Eclipse workspace unter Project --> Properties --> Run / Debug Settings --> Environment --> Select --> LD_LIBRARY_PATH --> ok

den Eintrag LD_LIBRARY_PATH auswählen --> edit
den Pfad zum Verzeichnis der shared library an das Ende anhängen, trennen mit ;


http://www.sethi.org/classes/cet375/lab_notes/lab_04_makefile_and_compilation.html

http://mrbook.org/tutorials/make/



/*
===========================================================================

INTERFACE DESIGN

===========================================================================
*/

Scanner
=======

Task:

	Communicates with all parties to produce a token on each step.
	It is the major interface to parser.

Interface IN:

	token Scanner::nextToken() // returns a token with all neccessary info to the parser until EOF

Interface OUT:

	char Buffer::getChar( void ) // buffer returns next char
	void Buffer::ungetChar( int len ) // buffer ungets char for amount of len
	char *Buffer::getLexem( void ) // buffer returns pointer to current lexem (null terminated, c_string style TODO see end of this file for more)
	int Buffer::getColumn( void ) // buffer returns current column
	int Buffer::getLine( void )	// buffer returns current line
	void Buffer::setNewLexem( void ) // informs buffer that a new lexem is about to be scanned
	bool Automaton::readChar( char ch ) // bool indicates the scanner that the automaton has recognized a token and it can be caught by the scanner
	tokentype Automaton::getTokenType( void ) // returns last recognized tokentype to scanner
	int Automaton::getBack( void ) // returns back variable which indicates to scanner how many chars it needs to instruct buffer to ungetChar()

Buffer
======

Task:

	Service provider to Scanner. Concerned with reading in and buffering input
	file and lexem info. It records current parsed lexem, its column and row info.
	It also	indicates EOF. Is controlled by scanner.

Interface IN:

	char Buffer::getChar( void ) // buffer returns next char
	void Buffer::ungetChar( int len ) // buffer ungets char for amount of len
	char *Buffer::getLexem( void ) // buffer returns pointer to current lexem (null terminated, c_string style TODO see end of this file for more)
	int Buffer::getColumn( void ) // buffer returns current Column
	int Buffer::getRow( void )	// buffer returns current row
	void Buffer::setNewLexem( void ) // informs buffer that a new lexem is about to be scanned

Interface OUT:

	<none>, maybe the low-level read functions to OS, when constructor is called
	and it reads in the input file.

Automaton
=========

Task:

	Service provider to Scanner. Accepts lexemes from source language as defined in
	SysprogI.pdf page 41. Indicates which tokentype a lexeme belongs to and outputs
	last recognized token type to scanner.

Interface IN:

	bool Automaton::readChar( char ch ) // bool indicates the scanner that the automaton has recognized a token and it can be caught by the scanner
	tokentype Automaton::getTokenType( void ) // returns last recognized tokentype to scanner
	int Automaton::getBack( void ) // returns back variable which indicates to scanner how many chars it needs to instruct buffer to ungetChar()

Interface OUT:

	<none>

Symboltable
===========

Task:

	Service provider to Scanner. Store every variable with each one's value and
    can return it when asked by the scanner

Interface IN:

	void Symboltable::setIdentifier(string name, int value)
    bool Symboltable::identifierExists(string name)
    int Symboltable::getValue(string name)

Interface OUT:

	int Symboltable::hash([string|int|...] seed) // TODO choose the seed


Coding Conventions:
===================

int function
{
	if() {
	} else {
	}

	for() {
	}

	while() {
	}
}

// tab = 4 spaces
// text width = 80

TODO
====

- ask if we are allowed to use #include <string>, if so we might change buffer interface from * char to string
  (see page 2)
- symboltable
- public header for parser