AtoCC Compiler Construction Workshop Michael Hielscher Aalborg, 26.03.08 Creating an Interpreter and Compiler for a music language ML
Jan 13, 2016
AtoCC Compiler Construction Workshop
Michael Hielscher Aalborg, 26.03.08
Creating an Interpreter and Compiler for a music language ML
Creating an Interpreter and Compiler for a music language ML
Content
Introduction
Why we created AtoCC
What is AtoCC
The music language ML
Create an interpreter for ML
Create a MLSVG compiler
2
Why we created AtoCC ?3
1. We want to motivate students to deal with theoretical
computer science.
We use Compiler Construction as an interesting topic
(practical use) right from the beginning.
We define a target project we want to solve (Compiler).
Target language is not machine code !!!
2. Cycles between teaching theory and using it in a practical
way (project based). The practical part is no add-on at the
end of theory class!
3. Students solve complex tasks in the area of theoretical
computer science with very high abstraction.
Why we created AtoCC ?
We needed a software package solving this
task without dealing with too much technical
stuff.
We needed software for teaching purposes
not for professional use.
4
Abstraction and problem solving model5
Computer Science based layer
Modelbased layer
Problembased layer
develop Software use Software
What is AtoCC ?
The learning environment AtoCC can be of use in teaching abstract automata, formal languages, and some of its applications in compiler construction.
From a teacher's perspective AtoCC aims to address a broad range of different learning activities forcing the students to actively interact with the subjects being taught.
AtoCC contains 6 programs: AutoEdit, AutoEdit Workbook, kfG-Edit, TDiag, VCC, SchemeEdit
6
www.atocc.de
Software we need today
Please install the following software: Java JDK Mozilla FireFox as SVG viewer AtoCC (www.atocc.de) Workshop ZIP file:
AtoCC Website A. Education Aalborg Materials
7
The music language ML
Like for mobile phones we can find several easy to read tone/music languages
We want to create an own primitive note language for monophonic songs (only one voice)
Example:C1-2 G1-8 A0-4 A0-8G0-4 G0-8 C0-8 P-2
8
The music language ML
This language is so primitive, that it is even a regular language.
A more complex language could include loops:[C1-2 G1-8 [A0-4 A0-8]] P-2(typical bracket example for push down automata)
9
The music language ML
Play with ML: Open folder „Songs“ and execute Console.bat
10
Task: Change song file content and get familiar with ML
Task: Change song file content and get familiar with ML
Creating an Interpreter
Create an Interpreter for ML
1) Define a T-Diagram
2) Define a grammar for ML
3) Define Scanner and Parser definition
4) Create S attributes
5) Generate the ML Interpreter compiler
6) Test the Interpreter with the help of the T-Diagram
11
Worksheet 1Worksheet 1
T-Diagrams
We use T-Diagrams to model our compiler processes.
Our diagrams look slightly different: We have 4 element types. Compiler, Program, Interpreter und E/A for
Input/Output
12
Compiler Program Interpreter Input/Output
Create a T-Diagram
Note down a T-Diagram for applying our ML Interpreter written in JavaBytecode on a program written in ML.
13
Create a T-Diagram14
Define a grammar for ML
One part of our T-Diagram, the Interpreter, we want to create now.
Therefore we need to define how ML looks like (Syntax). We use a context free grammar GML (in BNF).
Look at examples and try to figure out a grammar: G0-4 G1-2 A0-1 D1-32 P-16 A-8 P-2 C0-16 C1-8 F0-1 H1-2 P-1
15
Start with:Song NotesNotes ?
Start with:Song NotesNotes ?
Define a grammar for ML16
Define a grammar for ML17
Define a grammar for ML18
Create an Interpreter for ML
Basically we can say that an interpreter is similar to a compiler, but without generating some target language.
Therefore we will generate a compiler used as an interpreter, which does not output some target language.
19
How does a compiler work20
For an Interpreter we don’t care for output code, we want to execute something directly
For an Interpreter we don’t care for output code, we want to execute something directly
Creating an Interpreter from GML
21
We need to declare a scanner and a parser (a description how they shall work).
We start with a scanner definition. We define Token classes with patterns
(RegExp.) Easiest solution: for each terminal of GML we use
exactly one pattern (one Token class). More complex pattern result into a much less
work for the parser we shall try to give the scanner a job to do
Creating an Interpreter from GML
22
duration values (full, half, ¼, …)
all keynames
allowed octaves Tokenclasslist1
1
Creating an Interpreter from GML
We need to make sure, that none token overlaps the pattern of another.
But in program languages this is quite often the case:Keyword: beginIdentifier: [a-z]+
To solve this, the ordering of token classes in list is important!
23
We can rewrite our grammar to make use of our tokens as new terminals:
We will have 6 token classes with pattern for:KeyName, Token0, Token1, Token2_32, P and -
Creating an Interpreter from GML24
Creating an Interpreter from GML25
We can represent such pattern also as primitive Finite Automata:
Token2_322|4|8|16|32
KeyName C|D|E|F|G|H|A
Creating an Interpreter from GML
26
Creating an Interpreter from GML
27
We rename the generated token classes to useful names
We rename the generated token classes to useful names
Creating an Interpreter from GML
28
We need to specify the regular expressions we defined earlier
We need to specify the regular expressions we defined earlier
Creating an Interpreter from GML
29
Creating an Interpreter from GML
We can generate an empty compiler (scanner + parser) now and apply it on a program in ML:
We want to generate sound something is still missing
30
Creating an Interpreter from GML
We need to define S attributes for each parser rule. These attributes are small code fragments that are
executed when this rule is applied. Each rule returns a result $$ by executing the code
fragment (we need to fill $$).
Example:Note Key – Duration$$ = “Note: “ + $1 + “ Length: “+ $3;
31
The placeholders $1 to $n: In S attributes we can use placeholders for the results of
each rule right side element.
Creating an Interpreter from GML
32
$1$1 $2 $2
C1 C1 --
Input word: C1-8 C1-4Input word: C1-8 C1-4Input word: C1-8 D1-4Input word: C1-8 D1-4
From a token $n is always the input content (lexem)!
From a nonterminal $n is always the result $$ from this element!
From a token $n is always the input content (lexem)!
From a nonterminal $n is always the result $$ from this element!
$$ = "C1-8";$$ = "C1-8";
$2 $2
88
The placeholders $1 to $n: In S attributes we can use placeholders for the results of
each rule right side element.
Creating an Interpreter from GML
33
All $n and $$ have the data type String !!!
All $n and $$ have the data type String !!!
$1$1 $2 $2
C C 11
Input word: C1-8 C1-4Input word: C1-8 C1-4Input word: C1-8 D1-4Input word: C1-8 D1-4
$$ = "C1";$$ = "C1";
From a token $n is always the input content (lexem)!
From a nonterminal $n is always the result $$ from this element!
From a token $n is always the input content (lexem)!
From a nonterminal $n is always the result $$ from this element!
$1$1
C1 C1
Creating an Interpreter from GML
Now we can deal with: What will happen when a note rule is applied (playing a note or a pause)
On we can find 3 helper functions for playing MIDI notes.
We need to translate key names like C0 into according MIDI keys to be played.
34
Worksheet 1Worksheet 1
Creating an Interpreter from GML
35
Creating an Interpreter from GML
36
Generate the final interpreter again
Generate the final interpreter again
Execute the T-Diagram37
Creating a compiler
Create a ML SVG compiler
1) Define a T-Diagram
2) Define Scanner and Parser definition
3) Create S attributes
4) Generate MLSVG compiler
5) Test the compiler with the help of the T-Diagram
38
Worksheet 2Worksheet 2
Create a T-Diagram39
Creating a compiler40
Execute the T-Diagram
We can attach our new compiler to the T-Diagram and execute it:
41
Summary 42
C1-8 E1-4 D0-2 …C1-8 E1-4 D0-2 …[KeyName, "C"][Token1, "1"][Minus, "-"]…
[KeyName, "C"][Token1, "1"][Minus, "-"]…
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-...
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-...
Thanks for your attention
Any Questions ?
www.atocc.de