Advertisement
Ver0n1ka

Untitled

Jan 19th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. ((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++
  2. 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
  3. 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