Все три исходных файла для интерпретатора Mini С++: minicpp.cpp, parser.cpp и libcpp.cpp, включают в себя заголовочный файл mccommon.h, приведенный в листинге 9.4. | Листинг 9.4. Заголовочный файл mccommon.h // Общие объявления, используемые в parser.cpp, minicpp.cpp, // или libcpp.cpp, а также в других добавляемых вами файлах. // const int MAX_T_LEN = 128; // максимальная длина лексемы const int MAX_ID_LEN =31; // максимальная длина идентификатора const int PROG_SIZE = 10000; // максимальный размер программы const int NUM_PARAMS = 31; // максимальное число параметров // Перечислимый тип для типов лексем. enum tok_types { 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_msg { SYNTAX, NQJSXP, NOT_VAR, DUP_VAR, DUP_FUNC, SEMI_EXPECTED, UNBAL_BRACES, FUNC_UNDEF, TYPE_EXPECTED, RETJTOCALL, PAREN.EXPECTED, WHILE_EXPECTED, QUOTE_EXPECTED, DIV_BY_ZERO, BRACE_EXPECTED, COLON_EXPECTED }; extern char *prog; // текущая позиция в исходном коде extern char *p_buf; // указывает на начало буфера программы extern char token[MAX_T_LEN+1]; // строковая версия лексемы extern tok_types token_type; // содержит тип лексемы extern token_ireps tok; // внутреннее представление лексемы extern int ret_value; // значение, возвращаемое функцией extern bool breakfound; // true, если обнаружен оператор break // Класс-исключение для Mini С++, class InterpExc { error_msg err; public: InterpExc(error_msg e) { err = e; } error_msg get_err() { return err; } }; // Прототипы функций интерпретатора, void prescan(); void decl_jglobal () ; void call(); void putback(); void decl_local(); void exec_if () ; void find_eob(); void exec_for(); void exec_switch (); void get_params(); void get_args(); void exec_while(); void exec_do(); void exec_cout() ; void exec_cin(); void assign_var(char *var_name, int value); bool load_program(char *p, char *fname); inc find_var(char *s); void interp(); void func_ret(); char *find_func(char *name); bool is_var(char *s); token_ireps find_var_type(char *s); // Прототипы функций анализатора выражений. void eval_exp(int &value); void eval_expO(int &value); void eval_expl(int &value); void eval_exp2(int &value); void eval_exp3(int &value); void eval_exp4(int &value); void eval_exp5(int &value); void atom(int &value); void sntx_err(error_msg error); void putback(); bool isdelim(char c); token_ireps look_up(char *s); int f ind_var(char * s); tok_types get_token(); int internal_func(char *s); bool is_var(char *s); // Прототипы функций "Стандартной библиотеки", int call_jgetchar () ; int call_putchar(); int call_abs(); int call_rand(); Компиляция и компоновка интерпретатора Mini С++ Для применения Mini С++ вы должны откомпилировать и скомпоновать файлы minicpp.cpp, parser.cpp и libcpp.cpp. Для этого подойдет любой из современных компиляторов, включая Borland С++ и Visual С++. Например, для компилятора Visual С++ можно использовать следующую командную строку: cl -GX minicpp.cpp parser.cpp libcpp.cpp Для компилятора Borland С++ подойдет следующая командная строка: Ьсс32 minicpp.cpp parser.cpp libcpp.cpp Если вы пользуетесь другим компилятором, просто следуйте инструкциям, приведенным в сопроводительной документации. Примечание ^| В старых версиях компилятора Visual С++ интерпретатору Mini С++ может быть выделено недостаточное стековое пространство. Для увеличения размера стека можно использовать ключ /Fsize. Для интерпретации программы укажите ее имя в командной строке после minicpp Например, в следующей командной строке задана интерпретация программы, названной test.cpp: minicpp test.cpp
|