|
Программирование >> Формирование пользовательского контейнера
Проверяет, есть ли лексема в таблице. 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. Операции не фе-буют дополнительных пояснений. Категория знаков пунктуации включает в себя точку с запятой, запятую, фигурные и круглые скобки (некоторые знаки пунктуации в зависимости от их применения служат также знаками операций).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |