亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table of Contents
Compiler
Interpreter
Set up our programming language
What is a lexical analyzer?
Start creating a programming language!
Home Web Front-end CSS Tutorial Let's Create a Tiny Programming Language

Let's Create a Tiny Programming Language

Mar 13, 2025 am 11:18 AM

Let’s Create a Tiny Programming Language

You may already be familiar with one or more programming languages. But have you ever thought about how to create your own programming language? I mean:

A programming language is a set of rules that convert strings into various machine code outputs.

In short, a programming language is just a set of predefined rules. To make it useful, you need something that can understand these rules, such as compilers , interpreters , etc. So we can simply define some rules, and then, to make it work, we can write a program that can understand these rules using any existing programming language, which will become our interpreter.

Compiler

The compiler converts the code into machine code that the processor can execute (such as a C compiler).

Interpreter

The interpreter goes through the program line by line and executes each command.

Want to try it? Let's create a super simple programming language that outputs magenta output in the console. We call it Magenta .

Set up our programming language

I'll use Node.js, but you can learn in any language and the concept remains the same. Let me first create an index.js file and set it up.

 class Magenta {
  constructor(codes) {
    this.codes = codes;
  }
  run() {
    console.log(this.codes);
  }
}

// Currently, we store the code in a string variable called `codes` // Later, we will read the code from the file const codes = `print "hello world"
print "hello again"`;
const magenta = new Magenta(codes);
magenta.run();

What we are doing here is declaring a class called Magenta. This class defines and initializes an object that is responsible for recording text to the console using any text we provide through the codes variable. And, at present, we have defined the codes variable directly using several "hello" messages in the file.

OK, now we need to create a so-called lexical analyzer.

What is a lexical analyzer?

OK, let's talk about English first. Please see the following phrases:

Are you OK?

Here, "Hello" is a greeting, "Is" a supplementary tone, and "you" is a personal pronoun. We have a question mark ("?") at the end. We can divide any sentence or phrase into many grammatical components like this. Another way we distinguish these parts is to divide them into small marks. The program that divides text into tags is our lexical analyzer .

Since our language is very small, it has only two types of tags, each with a value:

  1. Keywords
  2. String

We can use regular expressions to extract tags from codes strings, but the performance will be very slow. A better approach is to loop through each character of the code string and get the tag. So let's create a tokenize method in the Magenta class - this will be our lexical analyzer.

Complete code `` javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { const length = this.codes.length; // pos 用于跟蹤當前位置/索引let pos = 0; let tokens = []; const BUILT_IN_KEYWORDS = ["print"]; // 變量/關鍵字允許的字符const varChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; while (pos Unknown token: ${word} <code>); } } return tokens; } parse(tokens) { const len = tokens.length; let pos = 0; while (pos Unexpected token: ${token.type}`); } } } run() { const tokens = this.tokenize(); this.parse(tokens); } } }

const codes = print "hello world" print "hello again" ; const magenta = new Magenta(codes); magenta.run();

### Define Rules and Syntax We want to see if our code order matches some rule or syntax. But first we need to define what these rules and syntax are. Since our language is very small, it has only a simple syntax, namely the print keyword followed by a string.

Keyword: Print string

<code>因此,讓我們創(chuàng)建一個解析方法,該方法循環(huán)遍歷我們的標記,并查看我們是否形成了有效的語法。如果是這樣,它將采取必要的措施。 ```javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { /* tokenizer 的先前代碼*/ } parse(tokens) { const len = tokens.length; let pos = 0; while (pos </code>

Look! We already have a working language!

OK, but putting the code in a string variable is not that fun. So let's put our Magenta code in a file called code.m. This way we can separate the magenta code from the compiler logic. We use .m as the file extension to indicate that the file contains code in our language.

Let's read the code from this file:

 // Import file system module const fs = require('fs');
// Import the path module to facilitate path connection const path = require('path');
class Magenta {
  constructor(codes) {
    this.codes = codes;
  }
  tokenize() {
    /* previous code for tokenizer*/
  }
  parse(tokens) {
    /* previous code of parse method*/
  }
  run() {
    /* previous code of run method*/
  }
}

// Read the code.m file // Some text editors use \r\n as a newline instead of \n, so we delete \r
const codes = fs
  .readFileSync(path.join(__dirname, 'code.m'), 'utf8')
  .toString()
  .replace(/\r/g, "");
const magenta = new Magenta(codes);
magenta.run();

Start creating a programming language!

In this way, we have successfully created a mini programming language from scratch. See, programming languages ??can be as simple as completing a specific thing. Of course, it is unlikely that languages ??like Magenta here can be useful to be part of a popular framework, but now you have an idea of ??what it takes to create a programming language.

The sky is the limit. If you want to dig deeper, try following the video I made, which introduces a more advanced example. In this video, I also show how to add variables to your language.

The above is the detailed content of Let's Create a Tiny Programming Language. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CSS tutorial for creating loading spinners and animations CSS tutorial for creating loading spinners and animations Jul 07, 2025 am 12:07 AM

There are three ways to create a CSS loading rotator: 1. Use the basic rotator of borders to achieve simple animation through HTML and CSS; 2. Use a custom rotator of multiple points to achieve the jump effect through different delay times; 3. Add a rotator in the button and switch classes through JavaScript to display the loading status. Each approach emphasizes the importance of design details such as color, size, accessibility and performance optimization to enhance the user experience.

Addressing CSS Browser Compatibility issues and prefixes Addressing CSS Browser Compatibility issues and prefixes Jul 07, 2025 am 01:44 AM

To deal with CSS browser compatibility and prefix issues, you need to understand the differences in browser support and use vendor prefixes reasonably. 1. Understand common problems such as Flexbox and Grid support, position:sticky invalid, and animation performance is different; 2. Check CanIuse confirmation feature support status; 3. Correctly use -webkit-, -moz-, -ms-, -o- and other manufacturer prefixes; 4. It is recommended to use Autoprefixer to automatically add prefixes; 5. Install PostCSS and configure browserslist to specify the target browser; 6. Automatically handle compatibility during construction; 7. Modernizr detection features can be used for old projects; 8. No need to pursue consistency of all browsers,

Styling visited links differently with CSS Styling visited links differently with CSS Jul 11, 2025 am 03:26 AM

Setting the style of links you have visited can improve the user experience, especially in content-intensive websites to help users navigate better. 1. Use CSS's: visited pseudo-class to define the style of the visited link, such as color changes; 2. Note that the browser only allows modification of some attributes due to privacy restrictions; 3. The color selection should be coordinated with the overall style to avoid abruptness; 4. The mobile terminal may not display this effect, and it is recommended to combine it with other visual prompts such as icon auxiliary logos.

Creating custom shapes with css clip-path Creating custom shapes with css clip-path Jul 09, 2025 am 01:29 AM

Use the clip-path attribute of CSS to crop elements into custom shapes, such as triangles, circular notches, polygons, etc., without relying on pictures or SVGs. Its advantages include: 1. Supports a variety of basic shapes such as circle, ellipse, polygon, etc.; 2. Responsive adjustment and adaptable to mobile terminals; 3. Easy to animation, and can be combined with hover or JavaScript to achieve dynamic effects; 4. It does not affect the layout flow, and only crops the display area. Common usages are such as circular clip-path:circle (50pxatcenter) and triangle clip-path:polygon (50%0%, 100 0%, 0 0%). Notice

What is the difference between display: inline, display: block, and display: inline-block? What is the difference between display: inline, display: block, and display: inline-block? Jul 11, 2025 am 03:25 AM

Themaindifferencesbetweendisplay:inline,block,andinline-blockinHTML/CSSarelayoutbehavior,spaceusage,andstylingcontrol.1.Inlineelementsflowwithtext,don’tstartonnewlines,ignorewidth/height,andonlyapplyhorizontalpadding/margins—idealforinlinetextstyling

What is the CSS Painting API? What is the CSS Painting API? Jul 04, 2025 am 02:16 AM

TheCSSPaintingAPIenablesdynamicimagegenerationinCSSusingJavaScript.1.DeveloperscreateaPaintWorkletclasswithapaint()method.2.TheyregisteritviaregisterPaint().3.ThecustompaintfunctionisthenusedinCSSpropertieslikebackground-image.Thisallowsfordynamicvis

How to create responsive images using CSS? How to create responsive images using CSS? Jul 15, 2025 am 01:10 AM

To create responsive images using CSS, it can be mainly achieved through the following methods: 1. Use max-width:100% and height:auto to allow the image to adapt to the container width while maintaining the proportion; 2. Use HTML's srcset and sizes attributes to intelligently load the image sources adapted to different screens; 3. Use object-fit and object-position to control image cropping and focus display. Together, these methods ensure that the images are presented clearly and beautifully on different devices.

What is CSS and what does it stand for? What is CSS and what does it stand for? Jul 03, 2025 am 01:48 AM

CSS,orCascadingStyleSheets,isthepartofwebdevelopmentthatcontrolsawebpage’svisualappearance,includingcolors,fonts,spacing,andlayout.Theterm“cascading”referstohowstylesareprioritized;forexample,inlinestylesoverrideexternalstyles,andspecificselectorslik

See all articles