Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ((include <iostream>#include <cstdlib>#include <cctype>#include <cstring>using namespace std;enum types { DELIMITER = 1, VARIABLE, NUMBER};class parser {char *exp_ptr; // Ссылается на выражение,char token[80]; // Хранит текущую лексему,char tok_type; // Хранит тип лексемы.void eval_exp2 (double Scresult);void eval_exp3 (double Scresult) ;void eval_exp4 (double Scresult);void eval_exp5 (double Scresult);void eval_exp6 (double Scresult);void atom (double Scresult) ;void get_token();void serror(int error);int isdelim(char c);public:parser();double eval_exp(char *exp);};// Конструктор синтаксического анализатора,parser::parser О{exp_ptr = NULL;}// Отправная точка синтаксического анализа,double parser::eval_exp(char *exp){double result;exp_ptr = exp;get_token () ,-if(!*token) {serror(2); // Выражение пусто.758Часть V. Приложения на языке C++
- return 0.0;}eval_exp2(result);if(*token) serror(O);return resu lt;}// Последней лексемой должен быть// нулевой символ.// Складываем или вычитаем два терма,void parser::eval_exp2(double kresult){register char op;double temp;eval_exp3(result) ;while((op = *token) == '+ ‘ || op == '-') {get_token();eval_exp3(temp);switch(op) {case '-':result = result - temp;break;case 1+ 1:result = result + temp;break;}}}// Умножаем или делим два фактора,void parser::eval_exp3(double kresult){register char op;double temp;eval_exp4(result);while((op = *token) == '*' || op == '/' || op == '%') {get_token();eval_exp4(temp);switch(op) {case 1 * 1:result = result * temp;break;case '/':result = result / temp;break;case 1 %' :result = (int) result % (int) temp;break;}}}// Возведение в степеньvoid parser::eval_exp4(double kresult){double temp, ex;Глава 40. Синтаксический анализ выражений759
- register int t;eval_exp5(result);if(*token== 'л ' ) {get_token();eval_exp4(temp);ex = result;if(temp==0.0) {result = 1.0;return;}for(t=(int)temp-1; t>0; — t) result = result * (double)ex;)}// Вычисление унарных операций + или -.void parser::eval_exp5(double kresult){register char op;op = 0 ;if((tok_type == DELIMITER) && *token=='+' || *token == '-') {op = *token;get_token();}eval_exp6(result);if(op=='-') result = -result;// Распознавание скобок,void parser::eval_exp6(double &result){if((*token == 1(')) {get_token ()eval_exp2(result);if(*token != ')')serror(1);get_token();}else atom(result);// Получает число,void parser::atom(double kresult){switch(tok_type) {case NUMBER:result = atof(token);get_token();return;default:serror(0);}}7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement