Я снова здесь спустя несколько дней. 😊 Сегодня я научу вас кое-чему очень интересному. Все используют языки программирования, которые кем-то разработаны. Давайте возьмем язык C, то, что C делает, он позволяет программистам реализовывать различные виды приложений, используя мощные функции C. Я пытаюсь объяснить вам это как можно проще. 😌 Все мы знаем, что каждый язык программирования имеет свой синтаксис и семантику. То, что мы написали в IDE, не имеет значения для компьютера. Следовательно, эти вещи должны быть преобразованы в машинопонятный язык, который называется машинным языком. Преобразование кода высокого уровня в машинный код называется этапом компиляции программы C. На самом деле, процесс компиляции, как вы видите, не является одношаговой задачей. Если копнуть глубже, то вы поймете, что компиляция состоит из нескольких шагов. Изучите рисунок ниже. (для моих юниоров-› Не беспокойтесь об этом, если вы получите предмет Теория языков программирования/Теория компилятора на своем уровне 4. 😆😆)

Я объясню эти шаги очень четко в моих следующих сообщениях. Давайте сначала посмотрим, что мы собираемся реализовать.
Я собираюсь реализовать свой собственный компилятор под названием «nim». Итак, какие функции есть у моего компилятора.
1. Он может складывать числа
2. Он может вычитать числа
3. Наш компилятор допускает только выражения, состоящие из чисел, а также +,- операторы, разделяющие каждое число. (Пример: 32+5)
4. В нашем языке также необходимо отсутствие пробелов между числами или операторами.

Поэтому я не собираюсь объяснять все концепции в этом посте. Я просто покажу, что делает мой компилятор и как я его реализовал.
На самом деле я использую Flex/Lex для реализации части лексического анализа компилятора и Bison(YACC) для реализации парсера. Это легко реализовать. Потому что сначала вам нужно написать свою lex-программу для лексического анализа части данного исходного кода. Файл Lex имеет расширение «.l». Затем мы должны написать наши правила грамматики, используя Bison(YACC). Наш файл Bison (YACC) имеет расширение «.y». Ниже показан код этих двух файлов. Не пытайтесь понять коды. Потому что вы не получите никакого представления о тех до сих пор. Не волнуйтесь, просто попытайтесь понять, что мы собираемся делать. Тогда мои следующие посты помогут вам понять каждую строку кодов.

Лексический анализатор. (нем.л)

Парсер. (ним.г)

Хорошо, теперь у нас есть два файла. Мы должны скомпилировать файл грамматики, файл lex, а затем объединить сгенерированные файлы C и скомпилировать вместе, чтобы создать исполняемую программу для нашего «nim»-компилятора.

Поскольку я использую UBUNTU, следующие команды сделают свою работу.

Обязательно выполняйте эти команды в заданном порядке. Потому что наш файл lex должен иметь заголовочный файл nim.tab.h, который генерируется при компиляции нашего файла парсера.
В последней команде мы компилируем наши сгенерированные файлы C вместе, чтобы создать исполняемый файл с именем «nimcompiler».

Теперь откройте терминал и запустите файл nimcompiler. он запросит источник ввода. Поэтому вам нужно указать исходный код, принятый этим компилятором, иначе компилятор скажет, что в исходном коде есть синтаксические ошибки. Мы закончили с нашим новым языком программирования 😇😇😇
См. вывод ниже.

Посмотрите, наш язык принимает только определенные синтаксические шаблоны. Наш компилятор принимает математические выражения только в следующем шаблоне.
12+4
Ниже приведены синтаксические ошибки.
12 + 4
12-a
11 -5
все остальные типы выражений считаются синтаксически неправильными. 😆😆

Первоначально опубликовано на http://printfnimesh.wordpress.com 13 июня 2017 г.