/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/yacc/yacc/lern3.txt


#################################### YACC #####################################


LALR(1)-Parser

parser.y    ->      Yacc            -> y.tab.c
y.tab.c     ->      C-Compiler      -> a.out
Eingabe     ->      a.out           -> Ausgabe

Spezifikationsfile: parser.y

yacc parser.y
gcc y.tab.c -ly

-ly!!! Damit Yacc-Bibliotheken eingebunden werden. 

Der erzeugte Parser steht als Funktion yyparse() zur Verfügung

Yacc-Spezifikation


Deklarationen
%%
Grammatik
%%
Hilfsprozeduren




%{
#include <ctype.h>
#include <stdio.h>
%}
%token NUMBER
%%
lines           : lines expr '\n' {printf("%d\n", $2); }
                | lines '\n'
                |
                ;
expr            : expr '+' term { $$ = $1 + $3; }
                | expr '-' term { $$ = $1 - $3; }
                | term
                ;
term            : term '*' factor { $$ = $1 * $3; }
                | term '/' factor { $$ = $1 * $3; }
                | factor
                ;
factor          : '(' expr ')' { $$ = $2; }
                | NUMBER
                ;
%%
int yylex() {
    int c;
    c = getchar();
    if (isdigit(c)) {
        ungetc(c, stdin); 
        scanf("%d", &yylval);
        return NUMBER;
    }
    return c;
}



Yacc-Spezifikationen, Grammatik-Teil:

- Nichtterminale (lines, expr, term, ...)
- Terminale (Token): 
    - Einzelne Zeichen, Typ char oder int '+', '(', '\n'
    - Explizit deklarierte Token (NUMBER); Im Deklarationsteil 
      %token NUMBER
- Produktionen 




############################## SCHEME ###############################

(+ 5 5 5 5)
(* (+ 2 3) 5)
(* (+ 1 2) 4)
(< 1 2)
(< 2 1)
(> 1 2)
(> 2 1)
(define (square x) (* x x))
(define (sqr x) (* x x))
(square 2)
(sqr 2)

############################ PYTHON ###################################

# Kommentar
2 + 2
(2+2)*4
100/16
1/16
1.0/16.0
"Hallo"
print('Super')
a = [100, 200, 300]
a[0]
a[1]
a[2]

############################## Uebersetzerbau ##########################

Syntaxanalyse: Die zweite Phase der Übersetzung ist die Syntaxanalyse
Syntaxbaum/Ableitungsbaum: Die Aufgabe der Syntaxanalyse besteht darin aus der Folge von Token einen Syntaxbaum zu berechnen

if id[1] cop[>=] const[10] then id[2] := const[1] end

Baum, Abbildung, siehe Seite 41

Grammatik: Basis für die Syntaxanalyse ist eine Grammatik

Einige Regeln einer Grammatik:

stmt    ::= assignment | cond
cond    ::= if boolexpr then stmt end |
            if boolexpr then stmt else stmt end
numexpr ::= id | const

Zwei Strategien:
1. Top-down-Analyse
2. Bottom-up

Top-down-Analyse: Baut den Baum von der Wurzel zu den Blättern hin auf 
Bottom-up-Analyse:  Der Baum wird von den Blättern her aufgebaut 
                    Dabei ist die Grundidee, so lange Token der Eingabefolge zu lesen und sich zu merken, bis eine vollständige rechte Seite einer Grammatikregel gelesen worden ist.
                    
Kontextfreie Grammatiken und Syntaxbäume 

Kontextfreie Grammatiken: Die Syntax höherer Programmiersprachen wird durch kontextfreie Grammatiken beschrieben 

Definition: Eine kontextfreie Grammatik ist ein Quadrupel G = (N, E, P, S), wobei gilt:
1. N ist ein Alphabet von Nichtterminalen 
2. E ist ein Alphabet von Terminalen. Die Alphabete N und E sind disjunkt
3. P = N x (N U E)* ist eine Menge von Produktionsregeln 
4. S in N ist das Startsymbol 

Nichtterminale: stmt, cond, ...
Terminale: if, id, ...
Produktionen: Paare bestehnd aus einem Nichtterminal und einer Folge von Nichtterinalen und Terminalsysmbolen 

stmt ::= assignment | cond

{(stmt, assigment), (stmt, cond)}

Produktionsregeln werden in formalen Betrachtungen häufig mit Pfeilen notiert. 

(A, alpha)
A -> alpha 

A -> alpha1, A -> alpha2, ..., A -> alphan

A -> alpha1 | alpha2 | ... | alphan

Nichtterminale: A, B, C, X, Y, Z, ...
Terminale: a, b, c, ...

...

Top-down-Analyse

Ableitungsbaum und Eingabefolge werden von links nach rechts gelesen 

Solange beide Folgen gleiche ... kann man weiterlesen ...

Falls zwei nicht übereinstimmende Terminalsymbole angetroffen werden, so ist
1. entweder eine vorher getroffene Produktion falsch gewesen und rückgängig zu machen
2. Die Eingabefolge syntaktisch nicht korrekt. 

stmt        ->  assigment | cond | loop
assignment  ->  id := expr
cond        ->  if boolexpr then stmt fi |
                if boolexpr then stmt else stmt fi
loop        ->  while boolexpr do stmt od
expr        ->  boolexpr | numexpr
boolexpr    ->  numexpr cop numexpr
term        ->  term * factor | factor
factor      ->  id | const | (numexpr)

In dieser Sprache:

if b > 0 then a := 1 fi

if id cop const then id := const fi

linksrekursive Produktionen: Das zu ersetzende Nichtterminal auf der rechten Seite der Produktion tritt wieder ganz links auf. 

Top-down-Analyse: Top-down-Analyse mit Backtracking 

Top-Down-Analyse: Linksrekursive Produktionen und Verlaufen in Sackgassen




########################################### Bash-Programmierung #################################
############################################## Commands #########################################

Benutzerverwaltung 

useradd: Hinzufügen eines Benutzers
userdel: Löschung eines Benutzers ("delete user")
usermod: Bearbeitung eines Benutzerkontos ("modify user")
newgrp: Änderung der Gruppe des aktuellen Benutzers ("new group")
groupadd: Hinzufügen einer Gruppe ("add group")
groupdel: Löschung einer Gruppe ("delete group")
groupmod: Bearbeitung einer Gruppe ("modify group")
chsh: Änderung der Standard-Shell des Benutzers ("change shell")
chfn: erweiterte Benutzerinformationen anpassen
passwd: Änderung des Passworts eines Benutzers ("password")
id: Anzeige der Benutzer- und Gruppenkennung (ID)

Grundkommandos 

cat: Verknüpfung von Dateien ("concatenate")
cd: Wechsel des Arbeitsverzeichnisses ("change directory")
cp: Kopie von Dateien oder Verzeichnissen ("copy")
date : Anzeige von Datum und Zeit
echo: Anzeige eines Textes
exit: Ende der Sitzung
info: Anzeige einer Hilfe-Datei
ln: Link zu einer Datei oder einem Verzeichnis ("link")
ls: Auflistung von Dateien ("list")

man: Ausgabe der Handbuchseite zu einem Befehl oder einer Anwendung ("manual")
mkdir: Erzeugung von Verzeichnissen ("make directory")
mmv: Multiple move (Datei-Mehrfachoperationen mit Hilfe von Wildcard-Mustern)
mv: Kopieren einer Datei und Löschen der Ursprungsdatei ("move"); mv im aktuellen Verzeichnis ausgeführt: Umbenennung einer Datei
pwd: Anzeige des aktuellen Verzeichnisses ("print working directory")
rm: Löschen von Dateien und Verzeichnisse ("remove")
rmdir: Löschen eines leeren Verzeichnisses ("remove directory")
sudo: Root-Rechte für den Benutzer ("substitute user do")
touch: Änderung der Zugriffs- und Änderungszeitstempel einer Datei oder eines Verzeichnisses (auch: Erstellen von Dateien)
unlink: Löschen einer Datei
Umleitungen: Umleitung von Ausgaben 

Dateiwerkzeuge

basename: Rückgabe des Dateinamens
blkid: Anzeige der UUID angeschlossener Laufwerke (siehe auch lsblk)
comm: Zeilenweiser Vergleich sortierter Dateien
cut: Spaltenweise Manipulation von Textdaten
dd: Bit-genaues Kopieren von Datenträgern
diff: Vergleich des Inhalts zweier Dateien (siehe auch patch für das Anwenden eines "Diffs")
dirname: Rückgabe des Pfades
find: Suche nach Dateien
grep: Durchsuchen von Dateien

locate: Suche nach Dateien mit Hilfe der Datenbank locatedb
lsblk: Anzeige von Informationen zu Speichermedien ("list block devices")
lsof: Anzeige offener Dateien ("list open files")
md5sum: Ermittlung und Überprüfung der MD5-Prüfsumme von Dateien
mount/umount: Ein- und Aushängen eines Dateisystems
paste: Daten aus mehreren Dateien spaltenweise zusammenführen
rename: Umbenennung von Dateien
rsync: Datensynchronisation
shred: Sicheres Löschen von Daten
sort: Sortieren von Dateien nach vorgegebenen Kriterien
split: Aufteilung großer Dateien in mehrere kleine
sync: Schreibt alle Daten aus dem Linux Schreibpuffer auf den Datenträger
tre-agrep: Werkzeug zur "unscharfen" Suche mit regulären Ausdrücken
tree: Verzeichnishierarchie rekursiv als Baumstruktur anzeigen
uniq: Ausgabe einer sortierten Datei ohne doppelte Zeilen
updatedb: Aktualisierung der locate-Datenbank ("update database") 

Pager

head: Ausgabe der ersten Zeilen einer Datei
less: Scrollfähige Anzeige einer Textdatei
more: Wie less, aber ohne die Fähigkeit, rückwärts zu scrollen
tail: Ausgabe der letzten Zeilen einer Datei 

Prozesssteuerung

nice: Vorgabe der Priorität eines Prozesses
nohup: Lösung eines Prozesses aus der Sitzung, die ihn aufruft
pgrep: Anzeige der Prozessidentifikationsnummer(n) zu gegebenen Prozessnamen/regulärem Ausdruck
pidof: Anzeige der Prozessidentifikationsnummer(n) zu gegebenen Prozessnamen
renice: Änderung der Priorität eines Prozesses zur Laufzeit
schedutils: Befehle für die fortgeschrittene Prozesskontrolle 

Rechte

chattr: Veränderung von Datei-Attributen und Rechten auf ext2- und ext3-Dateisystemen ("change attributes")
chgrp: Festlegung der Gruppenzugehörigkeit von Dateien ("change group")
chmod: Veränderung der Zugriffsrechte von Dateien ("change mode")
chown: Festlegung des Besitzers und der Gruppenzugehörigkeit von Dateien ("change ownership") 

Systemüberwachung

dmesg: Kernelmeldungen auf den Bildschirm ausgeben lassen; nützlich bei der Fehlersuche
at: Einstellung von einmalig durchzuführenden zeitgesteuerten Skript-/Befehlsaufrufen
crontab: Einstellung von zeitgesteuerten Skript-/Befehlsaufrufen
df: Ausgabe des Speicherplatzes aller eingehängten Laufwerke ("disk free")
du: Ausgabe des Speicherverbrauchs von Verzeichnissen ("disk usage")
free: Ausgabe der Arbeitsspeicherauslastung
kill: Beendigung eines durch die Prozess-ID gekennzeichneten Prozesses
killall: Beendigung von nach dem Prozessnamen gekennzeichneten Prozessen
pkill: Beendigung eines nach seinem Namen/durch einen regulären Ausdruck gekennzeichneten Prozesses
ps: Ausgabe aller laufenden Prozesse ("process status")
pstree: Ausgabe aller laufenden Prozesse in Baumform
script: Terminalsitzungen mitschneiden (siehe auch scriptreplay)
stat: Zeitstempel von Dateien und Ordnern anzeigen
top: Ausgabe der Prozessorauslastung
uptime: Angabe der Laufzeit und Auslastung des Computers
vmstat: erste Analyse von Engpässen 

Nützliche Befehle ohne Kategorie

alias: Vergabe von Kurznamen an Kommandos
apropos: Anzeige von Hilfe-Themen zu einem Stichwort
chroot: Ausführung eines Kommandos/einer interaktiven Shell in einem angegebenen Wurzelverzeichnis
clear: Löschen des momentanen Bildschirminhalts
dircolors: Anpassung der Farben von ls
logger: Einträge in /var/log/syslog erstellen
lscpu: Anzeige von Prozessor-Informationen ("list cpu")
lshw: Anzeige von Hardware-Informationen ("list hardware")
lspci: Anzeige von Informationen zur PCI-Hardware ("list pci")
lsusb: Anzeige von Informationen zur USB-Hardware ("list usb")
pinfo: Anzeige einer Hilfe-Datei an (ähnlich wie info)
pv: Ein Programm zum Betrachten des Fortschritt von Operationen durch Pipes
reboot: Rechner neu starten
rtcwake: Rechner automatisch Starten bzw. Herunterfahren
sed: Nicht-interaktiver Editor
seq: Sequenzen von Zahlen im Terminal erzeugen
shutdown: Herunterfahren des Systems
sleep: Pausieren von Prozessen
tasksel: Installationshilfe für die Kommandozeile
tee: Eingaben auf mehrere Ausgaben verteilen
time: Messung der Laufzeit von (Shell-)Befehlen
tr: Lesen, Umwandeln und Neuausgabe von Zeichenkombinationen ("translate"/"transliterate")
uname: Ausgabe von Systeminformationen ("unix name")
wall: Mitteilung an alle auf dem System eingeloggten Nutzer senden
watch: Periodischer Aufruf anderer Kommandos
wc: Zählung von Wörten, Zeilen und Zeichen in Textdateien ("word count")
whatis: Anzeige der Kurzbeschreibung eines Programms
whereis : Sucht das Binary (ausführbare Datei), den Quellcode und die man-Page eines Programms
which: Anzeige der Datei, die bei Eingabe eines Befehls ausgeführt wird
who: Anzeige von Informationen über angemeldete Benutzer
whoami: Anzeige des Benutzer, unter dem gerade gearbeitet wird
xargs: Anwendung eines Kommandos auf eine Liste von Dateien/Parametern, die von der Standardeingabe oder einer Datei kommen 

####################################### Bash-Programmierung #################################

bash script.sh 
./script.sh
/bin/bash ./script.sh

Erster Teil im Bash-Skript:

#!/bin/bash

Ausgabe:

echo "Dies ist eine Ausgabe"

Kommentare

# Dies ist ein Kommentar
# Das auch 
# Und das natuerlich auch
Das ist kein Kommentar # Trotz dem dazwischen
echo "# das # ist # auch # keiner"

####################################### Variablen #######################

var1=hallo
var2="Hallo Welt"

echo "$var1"
echo $var2

unset var1 # Variable loeschen 

################################### Variablen abgrenzen ########################

var=halloa
var1=hallob
var2=halloc
var3=hallod
var4=halloe

echo "${var}1"
echo "${var}2"
echo "${var}3"

######################## Maskierung ###############

\$test
"Dies \" ist ein Text\" aber was fuer einer"

####################### Ausgabe in Variable schreiben ################

yeahvar=$(ls -al)
echo $yeahvar

########################## arithmetische Ausdruecke ############################

echo $(( 4 ))
echo $(( 4+4 ))
echo $(( 4 + 4 ))
echo $(( ((4 + 2)*6+1)*8 ))

var1=34
echo $(( ($var1+2)*3 ))

typeset -i var2=34
echo $(( ($var2+2)*3 ))

typeset -i var3=50

while [ $var1 -le 50 ]
do
   echo $(( $var1 ))
   var1=$(( $var1+1 ))
done

var1=20

while [ $var1 -le $var3 ]
do
   echo $(( $var1 ))
   var1=$(( $var1+1 ))
done

while [ $var1 -ge 20 ]
do
   echo $(( $var1 ))
   var1=$(( $var1-1 ))
done



$(( arithmetischer Ausdruck ))

Zuweisung:
var1=$(( arithmetischer Ausdruck ))
var1=$(( $var1 + 1 ))
var1=$(( (4+3)*7 ))
Schleifen, Conditions, Abfragen

while [ $var -le 20 ] 
while [ $var -lt 20 ] 
while [ $var -ge 10 ]
while [ $var -gt 10 ]
while [ $var -eq 10 ]
while [ $var -ne 10 ]

le: less equal
ge: greater equal
lt: less than
gt: greater than
eq: equal
ne: not equal