Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Разбиение выражения на лексемы в языке Си

Лекция



Привет, сегодня поговорим про разбиение выражения на лексемы в языке си, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое разбиение выражения на лексемы в языке си , настоятельно рекомендую прочитать все из категории Алгоритмы и теория алгоритмов.

Для того чтобы вычислять выражения, необходимо уметь разбивать их на отдельные составляющие. Например, выражение А * В - (W + 10) состоит из таких элементов: А, *, В, -, (, W, +, 10 и ). Каждый из них представляет единую неделимую часть выражения. В общем случае необходима функция, которая возвращает один за другим все элементы выражения. Эта функция также должна уметь пропускать пробелы и символы табуляции и определять конец выражения.

Каждый элемент выражения называется лексемой (token). Поэтому функция, возвращающая очередную лексему, часто называетсяget_token(). В этой функции используется глобальный указатель на строку с разбираемым выражением. В показанной здесь версии функцииget_token() этот глобальный указатель называется prog. Переменная prog описана глобально, поскольку она должна сохранять свое значение между вызовами функции get_token() и быть доступной другим функциям. Помимо значения возвращаемой лексемы, необходимо знать ее тип. Для анализатора, разрабатываемого в данной главе, понадобятся только три типа: переменная, число и разделитель. Им соответствуют константы VARIABLENUMBER и DELIMITER, (DELIMITER используется как для операторов, так и для скобок.) Ниже приведен текст функцииget_token() вместе с необходимыми глобальными описаниями, константами и вспомогательной функцией:

#define DELIMITER 1
#define VARIABLE  2
#define NUMBER    3

extern char *prog;  /* указатель на анализируемое выражение */
char token[80];
char tok_type;

/* Данная функция возвращает очередную лексему. Об этом говорит сайт https://intellect.icu  . */
void get_token(void)
{
  register char *temp;

  tok_type = 0;
  temp = token;
  *temp = '\0';

  if(!*prog) return; /* конец выражения */
  while(isspace(*prog)) ++prog;  /* пропустить пробелы, символы
                                    табуляции и пустой строки */

  if(strchr("+-*/%^=()", *prog)){
    tok_type = DELIMITER;
    /* продвинуться к следующему символу */
    *temp++ = *prog++;
  }
  else if(isalpha(*prog)) {
    while(!isdelim(*prog)) *temp++ = *prog++;
    tok_type = VARIABLE;
  }
  else if(isdigit(*prog)) {
    while(!isdelim(*prog)) *temp++ = *prog++;
    tok_type = NUMBER;
  }

  *temp = '\0';
}

/* Возвращает значение ИСТИНА, если с является раздилителем. */
int isdelim(char c)
{
  if(strchr(" +-/*%^=()", c) || c==9 || c=='\r' || c==0)
    return 1;
  return 0;
}

Давайте рассмотрим приведенные выше функции более подробно. После нескольких инициализаций функция get_token() проверяет, не достигнут ли символ конца строки ( '0' ), завершающий выражение. Если в выражении еще есть неразобранная часть, функция get_token()сначала пропускает ведущие пробелы, если они имеются. После этого переменная prog указывает на число, переменную, оператор или — если выражение завершалось пробелами — на символ конца строки ( '0' ). Если очередной символ является оператором, он возвращается в виде строки, хранимой в глобальной переменной token, а переменной tok_type, содержащей тип полученной лексемы, присваивается значениеDELIMITER. Если же следующий символ является буквой, он считается именем переменной и возвращается в строковой переменной token. При этом tok_type получает значение VARIABLE. В случае, когда очередной символ является цифрой, считывается все число, причем оно помещается в переменную token, а его типом будет NUMBER. Наконец, если следующий символ не является ни одним из перечисленных выше, считается, что достигнут конец выражения. В этом случае token содержит пустую строку, возврат которой означает конец выражения.

Как уже было сказано ранее, чтобы не усложнять код этой функции, были опущены некоторые средства контроля за ошибками и сделаны некоторые допущения. Например, любой нераспознанный символ завершает выражение. Кроме того, в данной версии программы имена переменных могут иметь любую длину, но значащей является только первая буква. В соответствии с требованиями конкретной задачи вы можете усложнить средства контроля за ошибками и добавить другие подробности. Функцию get_token() можно доработать или модифицировать, чтобы она выбирала из входного выражения строки символов, числа других типов или лексемы другого типа.

Чтобы лучше понять принцип действия функции get_token(), ниже приведены возвращаемые ей лексемы и типы лексем для следующего входного выражения:

A + 100 - (B * C) /2
ЛексемаТип лексемы
А VARIABLE
+ DELIMITER
100 NUMBER
- DELIMITER
( DELIMITER
В VARIABLE
* DELIMITER
С VARIABLE
) DELIMITER
/ DELIMITER
2 NUMBER
нуль (конец строки) 0(нуль)

Следует помнить, что переменная token всегда содержит строку, завершающуюся символом конца строки ('0'), даже если эта строка состоит только из одного символа.

Надеюсь, эта статья про разбиение выражения на лексемы в языке си, была вам полезна, счастья и удачи в ваших начинаниях! Надеюсь, что теперь ты понял что такое разбиение выражения на лексемы в языке си и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Алгоритмы и теория алгоритмов

Из статьи мы узнали кратко, но содержательно про разбиение выражения на лексемы в языке си
создано: 2014-12-22
обновлено: 2021-03-13
132595



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Алгоритмы и теория алгоритмов

Термины: Алгоритмы и теория алгоритмов