430 likes | 443 Views
Explore AtoCC software & music language ML in Compiler Construction workshop. Learn to create an ML interpreter & compiler. Discover T-Diagrams, grammar definitions, and interpreter generation.
E N D
AtoCC Compiler Construction Workshop Creating an Interpreter and Compiler for a music language ML Aalborg, 26.03.08 Michael Hielscher
Content • Introduction • Why we created AtoCC • What is AtoCC • The music language ML • Create an interpreter for ML • Create a MLSVG compiler
Why we created AtoCC ? 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 !!! 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! 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.
Abstraction and problem solving model develop Software use Software Computer Science based layer Modelbased layer Problembased layer
What is AtoCC ? • The learning environment AtoCCcan be of use in teaching abstract automata, formal languages, and some of its applications in compiler construction. • From a teacher's perspective AtoCCaims to address a broad range of different learning activities forcing the students to actively interact with the subjects being taught. • AtoCCcontains 6 programs: AutoEdit, AutoEdit Workbook, kfG-Edit, TDiag, VCC, SchemeEdit 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
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
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)
The music language ML • Play with ML: • Open folder „Songs“ and execute Console.bat Task: Change song file content and get familiar with ML
Creating an Interpreter • Create an Interpreter for ML • Define a T-Diagram • Define a grammar for ML • Define Scanner and Parser definition • Create S attributes • Generate the ML Interpreter compiler • Test the Interpreter with the help of the T-Diagram Worksheet 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 Input/Output Compiler Program Interpreter
Create a T-Diagram • Note down a T-Diagram for applying our ML Interpreter written in JavaBytecode on a program written in ML.
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 Start with: Song NotesNotes ?
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.
How does a compiler work For an Interpreter we don’t care for output code, we want to execute something directly
Creating an Interpreter from GML • 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 all keynames Tokenclasslist allowed octaves 1 duration values (full, half, ¼, …) 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!
Creating an Interpreter from GML • 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 GML • We can represent such pattern also as primitive Finite Automata: Token2_32 2|4|8|16|32 KeyName C|D|E|F|G|H|A
Creating an Interpreter from GML We rename the generated token classes to useful names
Creating an Interpreter from GML We need to specify the regular expressions we defined earlier
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
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;
Creating an Interpreter from GML The placeholders $1 to $n: • In S attributes we can use placeholders for the results of each rule right side element. Input word: C1-8 C1-4 Input 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! $1 $2 $2 C1 - 8 $$ = "C1-8";
Creating an Interpreter from GML The placeholders $1 to $n: • In S attributes we can use placeholders for the results of each rule right side element. Input word: C1-8 C1-4 Input word: C1-8D1-4 • From a token $n is always the input content (lexem)! • From a nonterminal $n is always the result $$ from this element! $1 C1 $1 $2 C 1 • All $n and $$ havethedata type String !!! $$ = "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. Worksheet 1
Creating an Interpreter from GML • Generatethe final interpreteragain
Creating a compiler • Create a ML SVG compiler • Define a T-Diagram • Define Scanner and Parser definition • Create S attributes • Generate MLSVG compiler • Test the compiler with the help of the T-Diagram Worksheet 2
Execute the T-Diagram • We can attach our new compiler to the T-Diagram and execute it:
Summary <?xml version="1.0" ?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-... [KeyName, "C"] [Token1, "1"] [Minus, "-"] … • C1-8 E1-4 D0-2 …
Thanks for your attention Any Questions ? www.atocc.de