Программирование >>  Формирование пользовательского контейнера 

1 ... 122 123 124 [ 125 ] 126 127 128 ... 156


Проверяет, есть ли лексема в таблице. for(i=0; *conutable[i] .comtnand; i++) { if (!strcmp(conL.table[i] .comtnand, s)) return conutable[i].tok;

return UNDEFTOK; неизвестная команда

Возвращает индекс внутренней библиотечной функции или -1, если она не найдена, int intemal func(chcu: *s) {

int i;

for(i=0; intem func[i] .f jiaine[0]; i++) {

if (!strcitp(intem func[i] .fjiaine, s)) return i;

return -1;

Возврашает true, если с - ограничитель.

bool isdelim(char с)

if(strchr( !:;,+-<>/*%=() , c) с == 9

с == \r I I с == 0) return true; return false;

Анализатор использует следующие глобальные переменные и перечислимые типы (они объявлены в заголовочном файле mccommon.h, который будет приведен далее в этой главе).

const int MAX T LEN = 128; максимальная длина лексеьлл

const int MAX ID LEN = 31; максимальная длина идентификатора

Перечислимый тип для типов лексем.

Преобразует в нижний регистр, р = s;

v4iile(*p) { *р = tolower(*p); р++; }



enum teletypes { UNDEFTT, DELIMITER, IDENTIFIER,

NUMBER, KEYWORD. TEMP. STRING, BLOCK };

Перечислимый тип внутреннего представления лексем, enum token ireps { UNDEFTOK, ARG, CHAR, INT, SWITCH,

CASE, IF, ELSE, FOR, DO, WHILE, BREAK,

RETURN, COUT, CIN, END };

Перечислимый тип для двухсимвольных операций, таких как <=. enum double Ops { LT=1, LE, GT, GE, EQ, NE, LS, RS, INC, DEC };

Константы, используемые для генерации

исключения при наличии синтаксических ошибок.

Замечание: SYNTAX - общее сообщение об ошибке, используемое, когда нет более подходящего, enum error insg

{ SYNTAX, NO EXP, NOT VAR, DUP VAR, DUP FUNC,

SEMI EXPECTED, UNBAL BRACES, FUNC UNDEF,

TYPE EXPECTED, RET NOCALL, PAREN EXPECTED,

WHILE EXPECTED, QUOTE EXPECTED, DIV BY ZERO,

BRACE EXPECTED, COLON EXPECTED };

extern char *prog; текущая позиция в исходном коде extern char *p buf; указывает на начало буфера программы

extern char tokentMAX T LEN+l]; строковая версия лексемы extern tok types token type; содержит тип лексемы extern token ireps tok; внутреннее представление лексемы

extern int ret value; значение, возвращаемое функцией

Класс-исключение для Mini С++, class InterpExc {

error msg err; public:

InterpExc(error msg e) { err = e; } error msg get err() { return err; }



В переменной prog указывается текущая позиция в исходном коде, на которой находится выполняющаяся профамма в данный момент. Таким образом, в ней содержится адрес, начиная с которого будет читаться интерпретатором следующий фрагмент профаммы. Указатель p buf не меняется интерпретатором и всегда указывает на начало интерпретируемой профаммы Текущая лексема (token) хранится в переменной token (лексема - это неделимая часть кода профаммы). Тип лексемы содержится в переменной token type. Переменная tok хранит внутренний формат лексемы, если она представляет собой ключевое слово.

В перечислимом типе (enumeration) tok types объявлены типы лексем, распознаваемые интерпретатором Mini С++. Перечислимый тип token ireps описывает внутренний формат лексем, представляющих собой ключевые слова. Константы, обозначающие двухсимвольные знаки операций, такие как <=, заданы в перечислимом типе doubie ops. Различные коды ошибок перечислены в типе errorjnsg. Наконец, класс-исключение mterpExc предназначен для сообщения об ошибках.

Разбиение исходного кода на лексемы

Фундаментальным для всех интерпретаторов (и компиляторов в этом смысле) является механизм разбиения исходного кода на составляющие элементы, называемые лексемами. Лексема - это неделимая часть профаммы, представляющая одну логическую единицу. Примерами лексем могут служить {,+,== и if. Хотя операция равенства и обозначается двумя символами, их нельзя разделить, не изменив при этом их значения. Следовательно, комбинация == - это одна логическая единица, или лексема. Точно так же if представляет собой лексему, а отдельно i или f в языке С++ специального значения не имеют.

Стандарт С++, разработанный ANSI/ISO, определяет следующие типы лексем:

□ keywords (ключевые слова);

□ identifiers (идентификаторы);

□ literal (литерал);

П operator (операция);

□ punctuator (знак пунктуации).

Ключевые слова - это лексемы, которые формируют язык С++, например, while. Идентификаторы - это имена переменных, функций и т. д. К литералам относятся строки и значения констант, такие как 10. Операции не фе-буют дополнительных пояснений. Категория знаков пунктуации включает в себя точку с запятой, запятую, фигурные и круглые скобки (некоторые знаки пунктуации в зависимости от их применения служат также знаками операций).



1 ... 122 123 124 [ 125 ] 126 127 128 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика