Рубрики
Без рубрики

Вступление на разбор и лексицию

О я решил однажды, что я бы узнал C ++ и сделать язык программирования. Это пирог … Помечено Lexing, Parsing, CPP, Python.

Я решил однажды, что я бы узнал C ++ и сделать язык программирования. Это Пищевый . Я работаю над этим в течение 6 месяцев, и надеюсь, что он выйдет набухать. Я погрузился в него, и обнаружил, что вода была, путь, путь, путь до темно. Я решил сделать перерыв и узнать, как Лексинг и разборные работы. 2 месяца спустя я продолжил. Это продвинутая тема, и я все еще не знаю все это. Но это основы, которые помогут вам начать создавать свой собственный язык программирования!

Лексин или Лекс это первый шаг изготовления языка программирования. Я, если мне нужно предоставить кодовые фрагменты, напишу их в C ++.

Ну, Lexing в основном принимает исходный код (файл/вход) и превращает их в поток токенов. Возьмите этот код, например:

print(2 + 2);

Это вернет бы токен поток, что-то вроде этого:

IDENT: "print"
LPAREN: '('
NUMBER: '2'
OP: '+'
NUMBER: '2'
RPAREN: ')'
EOL: ';'

EOL обозначает конец линии кстати

Вы видите, как это пошел характер по персонажу? Это вернуло токен поток!

Если вы не получите то, что я имею в виду, подумайте об этом:

std::string Lexer(){
  // ...
  return token_stream;
}

Или что-то вроде того.

Давайте сделаем еще один токена …

int main(){
  std::cout << "Hello, world!";
}

Давайте посмотрим, что lexer выплесет на этот раз:

IDENT: "int"
IDENT: "main"
LPAREN: '('
RPAREN: ')'
LCURLY: '{'
IDENT: "std::cout"
LESS_THAN: '<'
LESS_THAN: '<'
STRING: "Hello, world!"
EOL: ';'
RCURLY: '}'

WOAH, это было гораздо больше! Представьте себе вашу самую большую программу, потом представьте, сколько токенов было!

Примечание: Посмотрите, как двойные цитаты исчезают? Вот потому что лексера видит их, но он не выводит их как токены, это просто говорит лексеру: “О, эй, это строка!”

Double-Note: СтД:: это библиотека так что если реальный Лексера увидела, что это будет как: «Позволяет получить доступ к прошедшему пространству struct/имен/класса STD! О, подожди, это построен в Lib! Давайте доступ к этому вместо

Давайте представим, что мы проверяли, было ли что-то оператор печати (этот код не реальный)!

if(type == "IDENT" && val == "std::cout"){
  //...
  std::cout << string;
}

Это не реальный код, это просто помогает нам понять больше!

Теперь, когда вы знаете немного Лексин, его разборки …

Парсер создает AST (Абстрактное синтаксическое дерево), а затем либо выполняет его или отправляет его на компилятор/интерпретатор, чтобы выполнить работу.

Пример AST:

     +
    / \
   1   2

Это основное представление AST помогает нам понять это лучше! Позвольте посмотреть здесь.

+ Символ говорит, что мы Добавление Эти цифры. Затем два числа ниже него ( 1, 2 ).

Позволяет принять более продвинутое уравнение.

1+2*3-4

Хм, мы не могли сделать это в заявлении, если! Вот почему мы должны отправить его на парсере!

       -
      /  \
     +    4
    / \
   1   *
       /\
      2  3

Помните, что маленькая AST, которую мы сделали раньше? Ну вот это, только больше их упакованы вместе! Не верь мне? Lemme объясняет. Мы начинаем с - или мин. (Помните, как мы начали с + последний раз?) Тогда мы пошли на + и 4 Отказ Давайте подумаем о плюсе как Переменная , который он содержит это значение: ++ (2 * 3) Я знаю, что против правил кодирования, Но это просто чтобы показать вам Ты понял? Хорошо. Причина Далее – вторая ступень.

Парсер в конце концов решает все проблемы, такие как:

# Second stage 
      - 
     / \
    +   4
   / \
  1   6 

Уведомление: Обратите внимание, как (2 * 3) повернулся к шести? Ага. Круто верно?

# Third stage
    -
   / \ 
  7   4

Уй, мы получили все это вниз до 7-4 Действительно Теперь мы можем просто сделать уравнение …

# Final stage 
3

Груз! Мы только что решили 1 + 2 * 3-4 Действительно

Требуется сильный разум на самом деле Код эти вещи. Я надеюсь, что вы можете сделать это, с основой, который я создал для вас.

Вот несколько полезных ссылок!

CraftingInterPres.com Эта ссылка помогла мне с основными знаниями, которые я знаю, так что пойдите проверку: https://craftingiverpres.com.

Pielang Хотите увидеть прогресс, который я делаю с моим языком? Вот ссылка на Github: https://github.com/elipie/pielang

Тогда самая полезная ссылка, которую я мог бы дать вам: https://google.com Google и любой браузер – отличный источник идей, а помощь.

Нашел ошибку, ошибку, опечатки или что-то, что не правда? Поместите его в комментарии

Оригинал: “https://dev.to/elipie/intro-to-parsing-lexing-3g01”