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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 13:07   #11
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Ну в общем да, он его не там увидел -х-5 --> (0-x)-5
Вы меня не поняли. Под "- x) - 5" я имел в виду что-нибудь вроде "(3 - x) - 5", т.е. то было просто конец выражения в скобке.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Так это ж не унарный минус...
У меня интерпретатор. Можно использовать вычитание из нуля без потери эффективности. Да и при компиляции можно было бы потом оптимизировать.
anyx вне форума Ответить с цитированием
Старый 10.12.2010, 13:19   #12
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
-5**3 --> (0-5)**3
-5/6 --> (0-5)/6
Тогда
x - 5 ** y => (x - 5) ** y, а надо x - (5 ** y)
anyx вне форума Ответить с цитированием
Старый 10.12.2010, 13:20   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Вы меня не поняли. Под "- x) - 5" я имел в виду что-нибудь вроде "(3 - x) - 5", т.е. то было просто конец выражения в скобке.
Запутал еще больше. Если у тебя есть интерпретатор то должна быть система разбора выражений. -х)-5 такого он выдавать не должен - это сущий ахтунг.
Смысл примерно в следующем - система разбирает вложенные выражения вида:
операнд1 операция операнд2.
Для данного выражения:
1) (3-х)-5
2) 5 ->5
3) 3-x
4) 3 -> 3
5) х -> текущее значение переменной х
6) возвращемся к пункту 3) 3-х -> вычисленное значение выражения
7) вернемся к пункту 1) (3-х)-5 -> вычисленное значение выражения

Примерно как-то так. И ежу понятно, что рекурсия здесь очень выгодна, да .

Цитата:
x - 5 ** y => (x - 5) ** y, а надо x - (5 ** y)
С какого перепугу? Перед тобой не унарный минус, а выражение. А это не одно и тоже. И хотя унарный минус тоже вид выражения, но в нем учавствует менее двух операндов... Подумай об этом.

ЗЫ. Не знаю как у тебя там все замучено - но если интерпретатор, то разбор выражения (если конечно он не состоит исключительно из констант, то есть не выражение которое можно вычислить сразу) можно осуществлять на этапе исполнения, а при разборе ограничиться только поверкой корректности выражения - ну так знаки чтобы как положено, скобки путем были и т.д.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.12.2010 в 13:35.
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 13:42   #14
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Опять же, надо хранить предыдущий токен. Видимо, другого способа нет?
Если хранить токен, то дальше мне всё понятно. Просто надеялся, что можно по другому.
anyx вне форума Ответить с цитированием
Старый 10.12.2010, 13:51   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Чем у тебя представлены токены? Не обязательно хранить предыдущий, можно хранить информацию о том, что предыдущий токен удовлетворяет определенному условию...
Покажи структуру данных которую ты используешь для токенов...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 14:12   #16
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Код:
typedef struct {
    int token;
    char *value
} FzToken;
FzToken *Fz_Lexer_GetToken(FzLexer*) возвращает следующий токен по коду.
Поле int token - это тип токена, например, TOK_SUB или TOK_ASSIGN_PLUS.
Поле char *value хранит значение, если токен - литерал

Можно добавить поле int last_token в struct FzLexer (состояние анализатора)

P.S. Ненавижу кнопку "Правка"!

Последний раз редактировалось anyx; 10.12.2010 в 14:18.
anyx вне форума Ответить с цитированием
Старый 10.12.2010, 14:16   #17
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я плакал, 4-е байта жалко .

Цитата:
Тогда
x - 5 ** y => (x - 5) ** y, а надо x - (5 ** y)
Только сейчас обратил внимание. Что-то Вы не допонимаете в работе своей модели, а именно:
а) Что такое унарный минус
б) Двойные стандарты - Вы предполагаете что работать будет так-то и так и при этом в одном примере игнорируете порядок операции, а вдругом нет.
в) Не видите разницы между операцией с одним операндом (входящим параметром) и операцией с двумя операндами.
г) Все математические выражения используемые, например, в Дельфи (но не С++, ибо там еще и логические примешиваются) включая вызов функций можно свести к цикличному либо рекурсивному вызову системы разбора выражений вида операнд1 операция операнд2. При этом разбивать на токены математические выражения для интерпретатора совершенно не обязательно. Вместо токенов можно использовать текущие, мгновенные значения операндов.
По пункту г) могу сказать что такая модель мною была реализована и при необходимости могу сбросить свой недоделанный интерпретатор (но разбор выражений там реализован, включая вызов функций).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.12.2010 в 15:22.
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать переключение языка ввода при попадании в определенное поле smoky Microsoft Office Access 6 15.09.2017 07:59
Вставка трансляции bsanchezb HTML и CSS 0 11.06.2009 22:57
Захват и запись видео трансляции из интернета polco Софт 1 02.02.2009 13:58