Слегка изменено оформление лекции 3 по языкам программирования
This commit is contained in:
+6
-6
@@ -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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user