Writing a Simple Programming Language from Scratch - Part 1 (2023)

Evan Typanski

Posted on • Updated on

#cpp #c #tutorial #compilers

If you're a developer, you've used programming languages. They're awesome ways to make a computer do what you want it to. Maybe you've even dove deep and programmed in assembly or machine code. Many never want to come back. But some wonder, how can I torture myself more by doing more low level programming? I want to know more about how programming languages are made! All joking aside, writing a new language isn't as bad as it sounds, so if you have even a mild curiosity, I would suggest you stick around and see what it's about.

This post is meant to give a simple dive into how a programming language can be made, and how you can make your own special language. Maybe even name it after yourself. Who knows.

I also bet that this seems like an incredibly daunting task to take on. Do not worry, for I have considered this. I did my best to explain everything relatively simply without going on too many tangents. By the end of this post, you will be able to create your own programming language (there will be a few parts), but there's more. Knowing what goes on under the hood will make you better at debugging. You'll better understand new programming languages and why they make the decisions that they do. You can have a programming language named after yourself, if I didn't mention that before. Also, it's really fun. At least to me.

Compilers and Interpreters

Programming languages are generally high-level. That is to say, you're not looking at 0s and 1s, nor registers and assembly code. But, your computer only understands 0s and 1s, so it needs a way to move from what you read easily to what the machine can read easily. That translation can be done through compilation or interpretation.

Compilation is the process of turning an entire source file of the source language into a target language. For our purposes, we'll think about compiling down from your brand new, state of the art language, all the way down to runnable machine code.

Writing a Simple Programming Language from Scratch - Part 1 (2)

(Video) Scratch Part 1 - Creating our own programming language

My goal is to make the "magic" disappear

Interpretation is the process of executing code in a source file more or less directly. I'll let you think that's magic for this.

So, how do you go from easy-to-read source language to hard-to-understand target language?

Phases of a Compiler

A compiler can be split up into phases in various ways, but there's one way that's most common. It makes only a small amount of sense the first time you see it, but here it goes:

Writing a Simple Programming Language from Scratch - Part 1 (3)

Oops, I picked the wrong diagram, but this will do. Basically, you get the source file, you put it into a format that the computer wants (removing white space and stuff like that), change it into something the computer can move around well in, and then generate the code from that. There's more to it. That's for another time, or for your own research if your curiosity is killing you.

Lexical Analysis

AKA "Making source code pretty"

Consider the following completely made up language that's basically just a calculator with semicolons:

 // source.ect 3 + 3.2; 5.0 / 1.9; 6 * 2;

The computer doesn't need all of that. Spaces are just for our petty minds. And new lines? No one needs those. The computer turns this code that you see into a stream of tokens that it can use instead of the source file. Basically, it knows that 3 is an integer, 3.2 is a float, and + is something that operates on those two values. That's all the computer really needs to get by. It's the lexical analyzer's job to provide these tokens instead of a source program.

How it does that is really quite simple: give the lexer (a less pretentious sounding way of saying lexical analyzer) some stuff to expect, then tell it what to do when it sees that stuff. These are called rules. Here's an example:

int cout << "I see an integer!" << endl;

When an int comes through the lexer and this rule is executed, you will be greeted with a quite obvious "I see an integer!" exclamation. That's not how we'll be using the lexer, but it's useful to see that the code execution is arbitrary: there aren't rules that you have to make some object and return it, it's just regular old code. Can even use more than one line by surrounding it with braces.

By the way, we'll be using something called FLEX to do our lexing. It makes things pretty easy, but nothing is stopping you from just making a program that does this yourself.

(Video) Make YOUR OWN Programming Language - EP 1 - Lexer

To get an understanding of how we'll use flex, look at this example:

 // scanner.lex /* Definitions */ %{ #include <iostream> using namespace std; extern "C" int yylex(); %} /* Rules next */ %% [0-9]+.[0-9]+ cout << "FLOAT: (" << yytext << ")" << endl; [0-9]+ cout << "INT: (" << yytext << ")" << endl; "+" cout << "PLUS" << endl; "-" cout << "MINUS" << endl; "*" cout << "TIMES" << endl; "/" cout << "DIVIDED BY" << endl; ";" cout << "SEMICOLON" << endl; [\t\r\n\f] ; /* ignore whitespace */ %% /* Code */ int main() { yylex(); }

This introduces a few new concepts, so let's go over them:

%% is used to separate sections of the .lex file. The first section is declarations - basically variables to make the lexer more readable. It's also where you import, surrounded by %{ and %}.

Second part is the rules, which we saw before. These are basically a large if else if block. It will execute the line with the longest match. Thus, even if you change the order of the float and int, the floats will still match, as matching 3 characters of 3.2 is more than 1 character of 3. Note that if none of these rules are matched, it goes to the default rule, simply printing the character to standard out. You can then use yytext to refer to what it saw that matched that rule.

Third part is the code, which is simply C or C++ source code that is run on execution. yylex(); is a function call which runs the lexer. You can also make it read input from a file, but by default it reads from standard input.

Say you created these two files as source.ect and scanner.lex. We can create a C++ program using the flex command (given you have flex installed), then compile that down and input our source code to reach our awesome print statements. Let's put this into action!

evan:ectlang/ $ flex scanner.lexevan:ectlang/ $ g++ lex.yy.c -lflevan:ectlang/ $ ./a.out < source.ectINT: (3)PLUSFLOAT: (3.2)SEMICOLONFLOAT: (5.0)DIVIDED BYFLOAT: (1.9)SEMICOLONINT: (6)TIMESINT: (2)SEMICOLONevan:ectlang/ $ 

Hey, cool! You're just writing C++ code that matches input to rules in order to do something.

Now, how do compilers use this? Generally, instead of printing something, each rule will return something - a token! These tokens can be defined in the next part of the compiler...

Syntax Analyzer

AKA "Making pretty source code usable"

It's time to have fun! Once we get here, we start to define the structure of the program. The parser is just given a stream of tokens, and it has to match elements in this stream in order to make the source code have structure that's usable. To do this, it uses grammars, that thing you probably saw in a theory class or heard your weird friend geeking out about. They're incredibly powerful, and there's so much to go into, but I'll just give what you need to know for our sorta dumb parser.

Basically, grammars match non-terminal symbols to some combination of terminal and non-terminal symbols. Terminals are leaves of the tree; non-terminals have children. Don't worry about it if that doesn't make sense, the code will probably be more understandable.

We'll be using a parser generator called Bison. This time, I'll split the file up into sections for explanation purposes. First, the declarations:

(Video) Create a programming language [part 1] - Setup

 // parser.y %{ #include <iostream> using namespace std; extern "C" void yyerror(char *s); extern "C" int yyparse(); %} %union{ int intVal; float floatVal; } %start program %token <intVal> INTEGER_LITERAL %token <floatVal> FLOAT_LITERAL %token SEMI %type <floatVal> exp %type <floatVal> statement %left PLUS MINUS %left MULT DIV

The first part should look familiar: we're importing stuff that we want to use. After that it gets a little more tricky.

The union is a mapping of a "real" C++ type to what we're going to call it throughout this program. So, when we see intVal, you can replace that in your head with int, and when we see floatVal, you can replace that in your head with float. You'll see why later.

Next we get to the symbols. You can divide these in your head as terminals and non-terminals, like with the grammars we talked about before. Capital letters means terminals, so they don't continue to expand. Lowercase means non-terminals, so they continue to expand. That's just convention.

Each declaration (starting with %) declares some symbol. First, we see that we start with a non-terminal program. Then, we define some tokens. The <> brackets define the return type: so the INTEGER_LITERAL terminal returns an intVal. The SEMI terminal returns nothing. A similar thing can be done with non-terminals using type, as can be seen when defining exp as a non-terminal that returns a floatVal.

Finally we get into precedence. We know PEMDAS, or whatever other acronym you may have learned, which tells you some simple precedence rules: multiplication comes before addition, etc. Now, we declare that here in a weird way. First, lower in the list means higher precedence. Second, you may wonder what the left means. That's associativity: pretty much, if we have a op b op c, do a and b go together, or maybe b and c? Most of our operators do the former, where a and b go together first: that's called left associativity. Some operators, like exponentiation, do the opposite: a^b^c expects that you raise b^c then a^(b^c). However, we won't deal with that. Look at the Bison page if you want more detail.

Okay I probably bored you enough with declarations, here's the grammar rules:

 // parser.y %% program: /* empty */ | program statement { cout << "Result: " << $2 << endl; } ; statement: exp SEMI exp: INTEGER_LITERAL { $$ = $1; } | FLOAT_LITERAL { $$ = $1; } | exp PLUS exp { $$ = $1 + $3; } | exp MINUS exp { $$ = $1 - $3; } | exp MULT exp { $$ = $1 * $3; } | exp DIV exp { $$ = $1 / $3; } ;

This is the grammar we were talking about before. If you're not familiar with grammars, it's pretty simple: the left hand side can turn into any of the things on the right hand side, separated with | (logical or). If it can go down multiple paths, that's a no-no, we call that an ambiguous grammar. This isn't ambiguous because of our precedence declarations - if we change it so that plus is no longer left associative but instead is declared as a token like SEMI, we see that we get a shift/reduce conflict. Want to know more? Look up how Bison works, hint, it uses an LR parsing algorithm.

Okay, so exp can become one of those cases: an INTEGER_LITERAL, a FLOAT_LITERAL, etc. Note it's also recursive, so exp can turn into two exp. This allows us to use complex expressions, like 1 + 2 / 3 * 5. Each exp, remember, returns a float type.

What is inside of the brackets is the same as we saw with the lexer: arbitrary C++ code, but with more weird syntactic sugar. In this case, we have special variables prepended with $. The variable $$ is basically what is returned. $1 is what is returned by the first argument, $2 what is returned by the second, etc. By "argument" I mean parts of the grammar rule: so the rule exp PLUS exp has argument 1 exp, argument 2 PLUS, and argument 3 exp. So, in our code execution, we add the first expression's result to the third.

Finally, once it gets back up to the program non-terminal, it will print the result of the statement. A program, in this case, is a bunch of statements, where statements are an expression followed by a semicolon.

Now let's write the code part. This is what will actually be run when we go through the parser:

(Video) Create Your Own Programming Language - Part 1

 // parser.y %% int main(int argc, char **argv) { if (argc < 2) { cout << "Provide a filename to parse!" << endl; exit(1); } FILE *sourceFile = fopen(argv[1], "r"); if (!sourceFile) { cout << "Could not open source file " << argv[1] << endl; exit(1); } // Sets input for flex to the file instead of standard in yyin = sourceFile; // Now let's parse it! yyparse(); } // Called on error with message s void yyerror(char *s) { cerr << s << endl; }

Okay, this is starting to get interesting. Our main function now reads from a file provided by the first argument instead of from standard in, and we added some error code. It's pretty self explanatory, and comments do a good job of explaining what's going on, so I'll leave it as an exercise to the reader to figure this out. All you need to know is now we're back to the lexer to provide the tokens to the parser! Here is our new lexer:

 // scanner.lex %{ extern "C" int yylex(); #include "parser.tab.c" // Defines the tokens %} %% [0-9]+ { yylval.intVal = atoi(yytext); return INTEGER_LITERAL; } [0-9]+.[0-9]+ { yylval.floatVal = atof(yytext); return FLOAT_LITERAL; } "+" { return PLUS; } "-" { return MINUS; } "*" { return MULT; } "/" { return DIV; } ";" { return SEMI; } [ \t\r\n\f] ; /* ignore whitespace */

Hey, that's actually smaller now! What we see is that instead of printing, we're returning terminal symbols. Some of these, like ints and floats, we're first setting the value before moving on (yylval is the return value of the terminal symbol). Other than that, it's just giving the parser a stream of terminal tokens to use at its discretion.

Cool, lets run it then!

evan:ectlang/ $ bison parser.yevan:ectlang/ $ flex scanner.lexevan:ectlang/ $ g++ lex.yy.c -lflevan:ectlang/ $ ./a.out source.ectResult: 6.2Result: 2.63158Result: 12

There we go - our parser prints the correct values! But this isn't really a compiler, it just runs C++ code that executes what we want. To make a compiler, we want to turn this into machine code. To do that, we need to add a little bit more...

Until Next Time...

I'm realizing now that this post will be a lot longer than I imagined, so I figured I'd end this one here. We basically have a working lexer and parser, so it's a good stopping point.

I've put the source code on my Github, if you're curious about seeing the final product. As more posts are released, that repo will see more activity.

Given our lexer and parser, we can now generate an intermediate representation of our code that can be finally converted into real machine code, and I'll show you exactly how to do it.

Part 2 is up!

(Video) Create Your Own Programming Language - The Tokeniser (Part 1)

Additional Resources

If you happen to want more info on anything covered here, I've linked some stuff to get started. I went right over a lot, so this is my chance to show you how to dive into those topics.

Oh, by the way, if you didn't like my phases of a compiler, here's an actual diagram. I still left off the symbol table and error handler. Also note that a lot of diagrams are different from this, but this best demonstrates what we're concerned with.

Writing a Simple Programming Language from Scratch - Part 1 (4)

FAQs

Can I make my own programming language? ›

You can't create a programming language if you don't know how to use a computer. Become familiar with the terminology. Compiler writers often use unfamiliar terminology. Read up on compilers before proceeding.

How do you make a programming language from scratch in Python? ›

PLY stands for Python Lex Yacc. It is a library you can use to make your own programming language with python. Lex is a well known library for writing lexers. Yacc stands for "Yet Another Compiler Compiler" which means it compiles new languages, which are compilers themself.

How do you write an interpreted language? ›

To create an interpreter first you need to create a lexer to get the tokens of your input program. Next you create a parser that takes those tokens and, by following the rules of a formal grammar, returns an AST of your input program. Finally, the interpreter takes that AST and interprets it in some way.

What is C++ written in? ›

The first C++ compiler (Cfront) was written in C++. To build that, I first used C to write a "C with Classes"-to-C preprocessor. "C with Classes" was a C dialect that became the immediate ancestor to C++. That preprocessor translated "C with Classes" constructs (such as classes and constructors) into C.

What is python written in? ›

Python is written in C (actually the default implementation is called CPython).

Is YouTube written in Python? ›

YouTube - is a big user of Python, the entire site uses Python for different purposes: view video, control templates for website, administer video, access to canonical data, and many more. Python is everywhere at YouTube. code.google.com - main website for Google developers.

How was C++ created? ›

C++ was developed by Bjarne Stroustrup at Bell Laboratories over a period starting in 1979. Since C++ is an attempt to add object-oriented features (plus other improvements) to C, earlier it was called as “C with Objects”. As the language developed, Stroustrup named it as C++ in 1983.

How are programming languages written? ›

Most programming languages are built from several parts: the lexer takes in the source code and converts it into tokens, the parser understands the structure described by the tokens and builds them into a syntax tree, and then the evaluator uses the syntax tree to decide what to do.

How can I make a compiler? ›

If languages each have a set of grammar rules, and those rules are all the legal expressions, then there are primarily two parts to building a compiler. Be able to read a file, parse it, then build an validate an Abstract Syntax Tree from that grammar.

How do I make a simple Python interpreter? ›

Creating your own interactive Python interpreter | Python tricks - YouTube

Which language is known as the machine code? ›

Machine code, also known as machine language, is the elemental language of computers. It is read by the computer's central processing unit (CPU), is composed of digital binary numbers and looks like a very long sequence of zeros and ones.

What is an example of a compiler? ›

1. Compiler : The language processor that reads the complete source program written in high-level language as a whole in one go and translates it into an equivalent program in machine language is called a Compiler. Example: C, C++, C#, Java.

What is Gmail coded in? ›

Gmail is a free email service provided by Google.
...
Gmail.
A screenshot of a Gmail inbox and compose box
Content licenseProprietary
Written inJava, C++ (back-end), JavaScript (UI)
11 more rows

Is C++ hard to learn? ›

C++ is known to be one of the most difficult programming languages to learn over other popular languages like Python and Java. C++ is hard to learn because of its multi-paradigm nature and more advanced syntax.

Is Excel written in C++? ›

Microsoft products like Word, Excel, Powerpoint have been written in both C and C++.

Is C harder than Python? ›

The syntax of a C program is harder than Python. Syntax of Python programs is easy to learn, write and read. In C, the Programmer has to do memory management on their own.

Which is faster Java or Python? ›

Read on to discover which language might be best for you to start learning. Java and Python are two of the most popular programming languages. Of the two, Java is the faster language, but Python is simpler and easier to learn.

Is Python slower than C++? ›

C++ is faster than Python because it is statically typed, which leads to a faster compilation of code. Python is slower than C++, it supports dynamic typing, and it also uses the interpreter, which makes the process of compilation slower.

What's the hardest coding language? ›

C++ C++ is considered to be one of the most powerful, fastest, and toughest programming languages.

Is HTML easier than Python? ›

Is HTML or Python Easier? Both HTML and Python are easy to learn and master. It's hard to choose which one is easier because they have different functions and applications.

What is the hardest language to learn? ›

Mandarin Chinese

Interestingly, the hardest language to learn is also the most widely spoken native language in the world. Mandarin Chinese is challenging for a number of reasons. First and foremost, the writing system is extremely difficult for English speakers (and anyone else) accustomed to the Latin alphabet.

Does NASA use Python? ›

Moreover, Python, as one of the programming languages used by NASA, played a significant role in this. I've been interested in space exploration for years. I follow world media reports on the success of space probes, rovers, and landers.

What programming does NASA use? ›

NASA has used many different programming languages ​​throughout its history. Even today, different computer programs are used for different applications. For example, HAL / S has been used for many NASA spacecraft, including the Space Shuttle. Today, ground computers use languages ​​such as C ++, Python and MATLAB.

What coding language is used at NASA? ›

HAL/S (High-order Assembly Language/Shuttle) is a real-time aerospace programming language compiler and cross-compiler for avionics applications used by NASA and associated agencies (JPL, etc.).

What are the 5 main programming languages? ›

Here are five basic programming languages to explore:
  • Python. This is a high-level and general-purpose language that focuses on code readability. ...
  • Java. ...
  • JavaScript. ...
  • C and C++ ...
  • SQL.

What are the 3 types of codes? ›

The Three Types of Code
  • Boring Code. Boring code is when it makes perfect sense when you read it. ...
  • Salt Mine Code. This is the type of code that's bonkers and makes not a lick of sense. ...
  • Radioactive Code. Radioactive code is the real problem at the heart of every engineering team.
3 Feb 2020

What is scratch in Python? ›

In Scratch, a variable needs to be created before it can be assigned a value, whereas in Python a variable is created upon assignment with a value. In Python, it is necessary to surround strings (any text) with either single ( ' ) or double ( " ) quotes.

Is C++ still useful? ›

There's nothing outwardly wrong with C++, – that's why it's still so widely used today.” In 2022, C++ is a useful, up-to-date, and vital programming language, especially as many of the world's major operating systems such as Microsoft Windows were built from the program.

Who is the father of C++? ›

Bjarne Stroustrup, the designer and original implementer of the programming language C++, a programming language used worldwide. Dr. Stroustrup began developing C++ in 1979, which first made its public appearance in 1985.

What can I build with C++? ›

Use Cases: What Can You Do with C++ ?
  • Game development. Many game developers consider C++ to be their favorite programming language to work with. ...
  • Operating systems. ...
  • Web browsers. ...
  • Machine learning. ...
  • Databases. ...
  • IoT devices. ...
  • Financial tools. ...
  • Flight software.

Which programming language should I learn first as a beginner? ›

Java. Java is one of the oldest object-oriented languages and one of the most sought-after languages to be proficient in. Because of its popularity, Java tutorials and information are widely available, making this a great candidate for starting your first programming project.

What is the example of programming language? ›

Examples are: Python, Ruby, Java, JavaScript, C, C++, and C#. Programming languages are used to write all computer programs and computer software. A programming language is like a set of instructions that the computer follows to do something.

Is all code written in English? ›

MAKING THE CODE IN ENGLISH

But not all programming codes are in English. Although most keywords are written in English, comments, variable user written classes and methods are often in the programmer's own language. Over a third of programming language were developed in English speaking countries.

Where do you write machine code? ›

Write a machine code program to write zeros into memory. The start address is given at address 0x80 and the number of words to write is given at address 0x84. We assume the start address is word aligned and the number of words to write is greater than zero.

Is compiler design hard? ›

They are hard to write well, but they're deceptively simple to start writing. A huge reason why compilers suffer from the perception that they're hard is because of the way they're taught at university. The instruction is too heavy on theory and too light on practical, hands-on, iterative learning.

Is compiler construction hard? ›

Compiler construction is a complex task. A good compiler combines ideas from formal language theory, from the study of algorithms, from artificial intelligence, from systems design, from computer architecture, and from the theory of programming languages and applies them to the problem of translating a program.

How many lines of code is the Python interpreter? ›

The CPython codebase is around 350,000 lines of C code (excluding header files) and almost 600,000 lines of Python code.

How do you write a compiler in Python? ›

In CPython, the compilation from source code to bytecode involves several steps:
  1. Tokenize the source code ( Parser/tokenizer. ...
  2. Parse the stream of tokens into an Abstract Syntax Tree ( Parser/parser. ...
  3. Transform AST into a Control Flow Graph ( Python/compile. ...
  4. Emit bytecode based on the Control Flow Graph ( Python/compile.

How do you type data in Python? ›

The integer, float, and complex values belong to a Python Numbers data-type. Python provides the type() function to know the data-type of the variable. Similarly, the isinstance() function is used to check an object belongs to a particular class. Python creates Number objects when a number is assigned to a variable.

What is the original programming code? ›

Computer Programming History: FORTRAN was the first computer programming language that was widely used.

What language are computer viruses written in? ›

C is a general-purpose programming language. It can be used to write all sorts of malware for different computing environments such as desktop, server and grid computing.

What is the most basic language that computers understand? ›

Machine language gives instructions as 0's and 1's and is the only language that the computer understands.

Is Python a compiler? ›

For the most part, Python is an interpreted language and not a compiled one, although compilation is a step. Python code, written in . py file is first compiled to what is called bytecode (discussed in detail further) which is stored with a . pyc or .

Is Python a compiler or interpreter? ›

Python is an interpreted language, which means the source code of a Python program is converted into bytecode that is then executed by the Python virtual machine.

How was C++ created? ›

C++ was developed by Bjarne Stroustrup at Bell Laboratories over a period starting in 1979. Since C++ is an attempt to add object-oriented features (plus other improvements) to C, earlier it was called as “C with Objects”. As the language developed, Stroustrup named it as C++ in 1983.

How was python created? ›

Python was conceived in the late 1980s by Guido van Rossum at Centrum Wiskunde & Informatica (CWI) in the Netherlands as a successor to the ABC programming language, which was inspired by SETL, capable of exception handling and interfacing with the Amoeba operating system. Its implementation began in December 1989.

How was the first programming language made? ›

1883: The first programming language was developed in 1883 when Ada Lovelace and Charles Babbage worked together on the Analytical Engine, which was a primitive mechanical computer. Lovelace was able to discern the importance of numbers, realizing that they could represent more than just numerical values of things.

How can I make my own operating system? ›

About This Article
  1. Take some computer science courses.
  2. Learn a high-level programming language at an advanced level.
  3. Learn a low-level assembly language.
  4. Complete an operating system tutorial.
  5. Plan your operating system.
  6. Create your programming environment.
  7. Build and test.
  8. Release a release candidate.
28 Jun 2022

Is C++ hard to learn? ›

C++ is known to be one of the most difficult programming languages to learn over other popular languages like Python and Java. C++ is hard to learn because of its multi-paradigm nature and more advanced syntax.

Is C++ still useful? ›

There's nothing outwardly wrong with C++, – that's why it's still so widely used today.” In 2022, C++ is a useful, up-to-date, and vital programming language, especially as many of the world's major operating systems such as Microsoft Windows were built from the program.

Who is the father of C++? ›

Bjarne Stroustrup, the designer and original implementer of the programming language C++, a programming language used worldwide. Dr. Stroustrup began developing C++ in 1979, which first made its public appearance in 1985.

Why is Python called snake? ›

When he began implementing Python, Guido van Rossum was also reading the published scripts from “Monty Python's Flying Circus”, a BBC comedy series from the 1970s. Van Rossum thought he needed a name that was short, unique, and slightly mysterious, so he decided to call the language Python.

Who invented coding? ›

Ada Lovelece, the Story Behind the Birth of Programming

The inventor of programming, Ada Lovelece, was born in 1815, and was the only daughter of the British writer Lord Byron, who died of illness while fighting in the Greek War of Independence when Ada was 8 years old.

Who owns Python now? ›

The Python Software Foundation (PSF) is a 501(c)(3) non-profit corporation that holds the intellectual property rights behind the Python programming language. We manage the open source licensing for Python version 2.1 and later and own and protect the trademarks associated with Python.

Videos

1. Creating a Programming Language (Part 001)
(jonahisadev)
2. PTE Speaking Repeat Sentence (Part-1) | September 2022 Exam Predictions | BEATthePTE
(BEATthePTE)
3. Make Your Own Programming Language - Part 1 - Lexer
(howCode)
4. A Simple Programming Language - (part 1 of 13)
(Brian Will)
5. 1. Writing a programming language - the Lexer
(Andy Balaam)
6. Making My Own Programming Language and Coding a Game in It
(AstroSam)
Top Articles
Latest Posts
Article information

Author: Nathanael Baumbach

Last Updated: 03/26/2023

Views: 5975

Rating: 4.4 / 5 (55 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Nathanael Baumbach

Birthday: 1998-12-02

Address: Apt. 829 751 Glover View, West Orlando, IN 22436

Phone: +901025288581

Job: Internal IT Coordinator

Hobby: Gunsmithing, Motor sports, Flying, Skiing, Hooping, Lego building, Ice skating

Introduction: My name is Nathanael Baumbach, I am a fantastic, nice, victorious, brave, healthy, cute, glorious person who loves writing and wants to share my knowledge and understanding with you.