Creating an expression node
No lecture description Lesson locked purchase
Description
Learn to create your very own C compiler from scratch. In this course we develop a compiler that compiles a subset of the C Programming Language. By the time you finish all modules of this course you will be able to compile C programs that use pointers, structures, unions, arrays, functions, for loops, while loops. do while loops, if statements, switches and much more! This course includes all course modules!
Our compiler also has a preprocessor macro system allowing you to include header files and create definitions just like you would in any C file.
Your compiler is advanced enough to use the GCC standard library so we are able to call C functions from our compiler. Your compiler will be able to compile the C programming language.
This course does not rely on any frameworks we do everything from scratch to ensure the best possible learning experience for students
Module 1
In module 1 of this course we load our C source file that we wish to compile, into memory. We create a lexer to preform lexical analysis on the source input which will convert the source code into a bunch of tokens that our compiler can easily understand. We then pass the tokens through a parser to produce an abstract syntax tree. An AST describes the C program in a logical way that makes it easier for our compiler to understand. For example for the expression 50 + 20 you will end up with a root expression node that has a left operand that has a node of value 50 and a right operand that has a node of value 20. Breaking down problems in this way makes it much easier to create compilers.
Module 2
In module 2 of this course we create a code generator that produces 32 bit Intel assembly language that can then be passed through an assembler to produce a program binary that we can run. We also in this module create a resolver system which is responsible for taking a complicated expression such as "a->b.c.e[50] = 50" and breaking it down into simple steps and rules that our code generator can then easily follow. This abstraction is essential to ensure that the code generator does not become over complex. With the use of a resolver system we can ensure the code base remains clean.
Module 3
In module 3 of this course we create a preprocessor and macro system. This preprocessor system allows us to include header files in our C programs and also use a variety of macro keywords such as "#define" "#ifdef" , "sizeof" and many more.
Module 4
In module 4 we build a semantic validator which validates our C code. A semantic validator ensures that we are not setting variables that do not exist or accessing structures that arent there.
This is the only video course in the world that shows you how to create a C compiler, come and learn today!
Requirements
-
You must have a basic experience of assembly language.
Who This Course is For
People with an interest in compiler design
People who are interested in assembly language
People who are interested in the C Programming language
What You Will be Learn
How to build a C compiler from scratch
Full understanding of stackframes and how assembly language is generared for a C source file
Complete Understanding of lexical analysis and parsing
Stronger Assembly language skills will be gained
Compiler Design
Dragon Zap Instructor
Daniel McCarthy is a seasoned software engineer, boasting an impressive career spanning over 14 years in the industry. Holding a Master's Degree in Advanced Computer Science from Cardiff Metropolitan University, his broad spectrum of experience encompasses everything from web development to complex compiler and interpreter development. Daniel has honed his skills in bootloader and kernel development. In testament to his proficiency in the field, he has designed two proprietary programming languages: Craft, a general-purpose language, and Marble, a web-focused language akin to PHP. Moreover, he has successfully developed compilers for the C programming language. A testament to his versatility, Daniel demonstrates proficiency in an extensive list of programming languages that includes C, C++, Java, x86 Assembly language, PIC assembly, SQL, PHP, HTML5, JavaScript, CSS, and of course, his own creations, Craft and Marble. His professional portfolio also includes the development of Linux kernel modules, a task he has executed with proficiency in a professional context. Currently, Daniel is channeling his wealth of experience and expertise into the education sector, with the aim of nurturing the next generation of professional software engineers.
Ask a question
Questions (1)
Jared
1 year ago
I understand that we have a temporary stack of nodes that we push/pop as we build the tree, but for some reason I'm struggling to visualize what is happening as I write it. What is the name of the parsing strategy we're using? I think I will benefit from having a higher level background understanding.
Daniel McCarthy
1 year ago
Hi, usually you use grammer parsers so you use a special grammer syntax and pass it into a parser which follows that grammer as rules. You can read more about that here: https://www.geeksforgeeks.org/types-of-parsers-in-compiler-design/ For more complicated parsers it is sometimes best to avoid grammer parsers that take that rule input. Our parser in this course for example is completley programatic, we use no grammer at all we manually parse every part of the C language. This allows us to have more flexibility of how we parse and making changes can be easier. I'm unable to give a name to this type of parser because it does not use a grammer. We manually parse everything. Theres probably a name for the type of parser it is but it is not so important. Well take an input of 50 + 30 . This in our compiler results in an expression node that holds a left node and a right node. Left being 50, and right being 30. What is it that your struggling to understand so I can help more.
Jared
1 year ago
Ok thank you. I reviewed the video and the link a few times and it makes sense. Could you explain the relationship between the DragonCompiler and the PeachCompiler on GitHub? And are either of them at the point of being able to self compile yet?
Daniel McCarthy
1 year ago
Hi, Both PeachCompiler and DragonCompiler are C-Like compilers meaning they support majority of the syntax of the C programming language but do not meet the specification 100%. Our compilers can compile most C code. Initializers are one example of things that are not included. This is a training course on how to build a compiler so we focus only on the most important things and a C-Like compiler is much more exciting than a simple compile for a custom language (In my opinion). However at the end of the course you should have the skills to continue implementing every part of C should you choose. When I go to build a course I first start by creating the whole project, then I make a course remaking that project, as you know bugs are very common in software development, this is why I build the project first then rebuild it for a course. I may develop Dragon Compiler at some point to be at a stage it can self compile but at the moment I have no plans to do so. The projects have always been to just teach compiler development and a C-Like compiler in my opinion is much more interesting than a compiler that attempts to compile something like BASIC. That is why a more complicated project was chosen as this training exercise.
Daniel McCarthy
1 year ago
Additionally PeachCompiler is the compiler that is the result of this video course with each commit in that repository being named after the video lecture that created it to allow you students to follow along easily.
Jared
1 year ago
Ok thank you!