Форум программистов, компьютерный форум CyberForum.ru

Простейший калькулятор на YACC - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Шаблон структуры данных http://www.cyberforum.ru/cpp-beginners/thread1037932.html
Всем привет, в универе дали задание, не понимаю совсем, напишите пожалуйста, Разработать шаблоны структуры данных в памяти. Тип хранимого элемента – параметр шаблона. Шаблон может содержать указатель на объект, либо сам объект (в зависимости от варианта). Реализовать операции включения/удаления по заданному логическому номеру, поиск минимального/максимального, включение с сохранением порядка,...
C++ Из вещественного в строку как тип double превратить строку? http://www.cyberforum.ru/cpp-beginners/thread1037899.html
Баг в программе C++
Доброго времени суток,форумчане. Задача такова: Массивв символов,содержащий 16-ое представление чисел. Надо перевести hex в dec. Баг в 16-ом представлении чисел, 10-ые работают нормально. #include <iostream> #include <cstdlib> #include <cmath> using namespace std; //Находим длину
C++ Пользователь вводит две пары вещественных чисел: k 1,b1 и k 2,b2. Составить функцию для определения точки пересечения двух прямых y=k1x+b1 и y=k2x+b2,
Пользователь вводит две пары вещественных чисел: k1,b1и k2,b2. Составить функцию для определения точки пересечения двух прямых y=k1x+b1 и y=k2x+b2, которая получает введенные числа в качестве параметров. Координаты найденной точки пересечения функция возвращает в качестве двух других параметров. Результат, который возвращает сама функция, должен позволять отслеживать следующие случаи...
C++ Считывает текст с файла и выводит в другой файл http://www.cyberforum.ru/cpp-beginners/thread1037883.html
Здравствуйте, уважаемые) По возможности помогите с написанием кода, буду очень благодарен. Условие: Написать программу, которая считывает текст с файла и выводит в другой файл и на экран только предложения, которые начинаются с тире, перед которым могут идти только пробелы.
C++ Одномерный массив B[n] и преобразовать его следующим образом Здравствуйте! Подскажите пожалуйста, как решить такую задачу: Одномерный массив B и преобразовать его следующим образом: 1) увеличить каждый элемент массива на максимальный элемент 2) найти индекс и значение последнего минимального элемента массива 3) отсортировать элементы массива по убыванию подробнее

Показать сообщение отдельно
Xref
Сообщений: n/a
11.12.2013, 22:49     Простейший калькулятор на YACC
Наверно тут придётся ввести ещё один вид токена — целое число. Грамматика станет чуть больше, придётся описать ещё раз все операции для целых чисел. Приблизительно так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
%{
#include <stdio.h>
typedef union {
    int int_val;
    double double_val;
} YYSTYPE;
%}
%token<double_val> DATA
%token<int_val> IDATA
%left '+' '-'
%left '*' '/' '%'
%type<double_val> wyrag spisok
%type<int_val> int_wyrag
%%
spisok :
| spisok '\n'
| spisok wyrag '\n' { printf("\t%g\n", $2); }
;
wyrag : DATA { $$ = $1; }
| wyrag '+' wyrag { $$ = $1 + $3; }
| wyrag '-' wyrag { $$ = $1 - $3; }
| wyrag '*' wyrag { $$ = $1 * $3; }
| wyrag '/' wyrag { $$ = $1 / $3; }
| int_wyrag { $$ = (double) $1; }
| '(' wyrag ')' { $$ = $2; }
;
int_wyrag : IDATA { $$ = $1; }
| int_wyrag '+' int_wyrag { $$ = $1 + $3; }
| int_wyrag '-' int_wyrag { $$ = $1 - $3; }
| int_wyrag '*' int_wyrag { $$ = $1 * $3; }
| int_wyrag '/' int_wyrag { $$ = $1 / $3; }
| int_wyrag '%' int_wyrag { $$ = $1 % $3; }
| '(' int_wyrag ')' { $$ = $2; }
%%
То есть пока числа целые — над ними можно выполнять операцию взятия остатка. Как только в операциях появились числа с плавающей точкой — эту операцию выполнять нельзя. YYSTYPE объявляется как union, чтобы хранить значения разных типов в зависимости от ситуации. С помощью %type указывается, какой элемент нужно использовать для получения/записи значения. Аналогичная ситуация при объявлении токенов.
В лексере нужно будет в зависимости от числа на входе присваивать значение либо yylval.double_value, либо yylval.int_value, и возвращать DATA или IDATA соответственно.
 
Текущее время: 16:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru