diff --git a/2 курс/Языки программирования/Цикл трансляции, лексический и синтаксический анализ.md b/2 курс/Языки программирования/Цикл трансляции, лексический и синтаксический анализ.md index 9ff38ea..36e166c 100644 --- a/2 курс/Языки программирования/Цикл трансляции, лексический и синтаксический анализ.md +++ b/2 курс/Языки программирования/Цикл трансляции, лексический и синтаксический анализ.md @@ -187,7 +187,7 @@ parse_expr() Опишем все более подробно. `parse_expr()` последовательно разбивает полученную строку на узлы, и только в конце соединяет их в итоговое выражение. Иными словами, он не воспринимает те же символы "2, \*, 3" отдельно друг от друга, он их даже не читает. Вместо этого он получает от `parse_term` сразу готовый узел (2 \* 3) и подсоединяет его к строящемуся дереву. Тот же разбор математического выражения можно расписать на языке C. -```C +```c Node *parse_expr(Lexer *lx) { Node *left = parse_term(lx); while (peek(lx) == '+' || peek(lx) == '-') { @@ -227,7 +227,7 @@ Node *parse_factor(Lexer *lx) { Для реализации таких макроподстановок используются специальные директивы, включая `#include`, `#define`, `#ifdef`, `#ifndef`. Примером такой ошибки препроцессора может служить следующий код. -```C +```c #define SQUARE(x) x * x int a = SQUARE(2 + 3) @@ -236,7 +236,7 @@ int a = 2 + 3 * 2 + 3 // = 11, а не 25 ``` Поэтому при использовании макросов рекомендуется использовать защиту. -```C +```c #define SQUARE(x) ((x) * (x)) int a = SQUARE(2 + 3) @@ -259,13 +259,13 @@ CC = gcc CFLAGS = -Wall -std=c17 hello: hello.o string.o - $(CC) -o $@ $^ + $(CC) -o $@ $^ %.o: %.c - $(CC) -c $(CFLAGS) -o $@ $< + $(CC) -c $(CFLAGS) -o $@ $< clean: - rm -f hello *.o + rm -f hello *.o .PHONY: clean ```