Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 15:02   #1
program09
Новичок
Джуниор
 
Регистрация: 01.06.2009
Сообщений: 1
Сообщение Калькулятор

По книжке Б.Страуструпа "Введение в язык С++" я пытался собрать его программу калькулятор(с анализаторами), но не получается. Выходят куча ошибок. Вот то что я собрал:
main.срр
Код:
enum token_value {
      NAME,    NUMBER,    END,
      PLUS='+',    MINUS='-',    MUL='*',    DIV='/',
      PRINT=';',    ASSIGN='=',    LP='(',    RP=')'
  };
  extern int no_of_errors;
  extern double error(char* s); 
  extern token_value get_token();
  extern token_value curr_tok;
  extern double number_value;
  extern char name_string[256];

  extern double expr();
  extern double term();
  extern double prim();

  struct name {
      char* string;
      name* next;
      double value;
  };

  extern name* look(char* p, int ins = 0);
  inline name* insert(char* s) { return look(s,1); }
lex.cpp
Код:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "dc.h"
using namespace std;
token_value curr_tok;
double number_value;
char name_string[256];

token_value get_token(){
      char ch,WS;
      do {    // пропускает пропуски за исключением '\n'
          if(!cin.get(ch)) return curr_tok = END;
      } while (ch!='\n' && isspace(ch));

      switch (ch) {
      case ';':
      case '\n':
          cin >> WS;    // пропустить пропуск
          return curr_tok=PRINT;
      case '*':
      case '/':
      case '+':
      case '-':
      case '(':
      case ')':
      case '=':
          return curr_tok=ch;
      case '0': case '1': case '2': case '3': case '4':
      case '5': case '6': case '7': case '8': case '9':
      case '.':
          cin.putback(ch);
          cin >> number_value;
          return curr_tok=NUMBER;
      default:            // NAME, NAME= или ошибка
          if (isalpha(ch)) {
              char* p = name_string;
              *p++ = ch;
              while (cin.get(ch) && isalnum(ch)) *p++ = ch;
              cin.putback(ch);
              *p = 0;
              return curr_tok=NAME;
          }
          error("плохая лексема");
          return curr_tok=PRINT;
      }
}
syn.cpp
Код:
#include "dc.h"

double prim()                 // обрабатывает primary (первичные)
  {
	  char* string;
      switch (curr_tok) {
      case NUMBER:              // константа с плавающей точкой
          get_token();
          return number_value;
      case NAME:
          if (get_token() == ASSIGN) {
              name* n = insert(name_string);
              get_token();
              n->value = expr();
              return n->value;
          }
          return look(name-string)->value;
      case MINUS:               // унарный минус
          get_token();
          return -prim();
      case LP:
          get_token();
          double e = expr();
          if (curr_tok != RP) return error("должна быть )");
          get_token();
          return e;
      case END:
          return 1;
      default:
          return error("должно быть primary");
      }
}

double term()                    // умножает и складывает
  {
      double left = prim();

      for(;;)
          switch(curr_tok)    {
          case MUL:
              get_token();         // ест '*'
              left *= prim();
              break;
          case DIV:
              get_token();         // ест '/'
              double d = prim();
              if (d == 0) return error("деление на 0");
              left /= d;
              break;
          default:
              return left;
          }
}

double expr()                     // складывает  и вычитает
  {
      double left = term();

      for(;;)                     // ``навсегда``
          switch(curr_tok) {
          case PLUS:
              get_token();        // ест '+'
              left += term();
              break;
          case MINUS:
              get_token();        // ест '-'
              left -= term();
              break;
          default:
              return left;
          }
}
прдолжение проги в след. сообщений
program09 вне форума Ответить с цитированием
Старый 01.06.2009, 15:39   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

продолжение калькулятора
table.cpp
Код:
 #include "dc.h"

  extern char* strcmp(const char*, const char*);
  extern char* strcpy(char*, const char*);
  extern int strlen(const char*);

  const TBLSZ = 23;
  name* table[TBLSZ];

  //extern int strlen(const char*);
  //extern int strcmp(const char*, const char*);
  //extern int strcpy(const char*, const char*);

  name* look(char* p, int ins =0)
  {
      int ii = 0;        // хэширование
      char* pp = p;
      while (*pp) ii = ii<<1 ^ *pp++; if (ii < 0) ii="-ii;" ii %="TBLSZ;" for (name* n="table[ii];" n; n="n-">next)    // поиск
          if (strcmp(p,n->string) == 0) return n;

      if (ins == 0) error("имя не найдено");

      name* nn = new name;                     // вставка
      nn->string = new char[strlen(p)+1];
      strcpy(nn->string,p);
      nn->value = 1;
      nn->next = table[ii];
      table[ii] = nn;
      return nn;
}
dc.h
Код:
enum token_value {
      NAME,    NUMBER,    END,
      PLUS='+',    MINUS='-',    MUL='*',    DIV='/',
      PRINT=';',    ASSIGN='=',    LP='(',    RP=')'
  };

  extern int no_of_errors;
  extern double error(char* s);
  extern token_value get_token();
  extern token_value curr_tok;
  extern double number_value;
  extern char name_string[256];

  extern double expr();
  extern double term();
  extern double prim();

  struct name {
      char* string;
      name* next;
      double value;
  };

  extern name* look(char* p, int ins = 0);
  inline name* insert(char* s) { return look(s,1); }
Вторую тему удалил.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
калькулятор FARGO Общие вопросы Delphi 1 14.12.2008 23:01
Калькулятор ViNcHeStEr Помощь студентам 5 23.11.2008 15:39
Калькулятор Nixtone Помощь студентам 7 03.07.2008 23:17
Калькулятор Ivanich Помощь студентам 5 21.12.2007 14:48
Калькулятор Maycal Общие вопросы C/C++ 2 18.11.2007 06:02