Здесь есть путаница, потому что вы думаете, что x += 1;
всегда x = x + 1
. Это верно для целых чисел, двойных чисел ... но, как правило, НЕ относится к другим объектам. Многие реализации не создают временный объект. Или мог сделать что-то очень злое.
Итак, это вызов operator+=
, который принимает в качестве аргумента результат правой части присваивания.
Так что для целых чисел, это x = x + (y % 3)
.
Это не слишком трудно сделать. Вы захотите присвоить каждому оператору неподвижность (инфикс, префикс или постфикс) и приоритет. Сделайте приоритет вещественным числом; Вы будете благодарить меня позже. Операторы более высокого приоритета связывают более плотно, чем операторы более низкого приоритета; на равных уровнях приоритета можно потребовать разрешения неоднозначности с круглыми скобками, но Вы, вероятно, предпочтете разрешать некоторым операторам быть ассоциативными, таким образом, можно будет записать
x + y + z
без круглых скобок. После того как у Вас есть неподвижность, приоритет и ассоциативность для каждого оператора, Вы захотите записать парсер первенства операторов. Этот вид синтаксического анализатора должен справедливо просто записать; это сканирует маркеры слева направо и использует один вспомогательный стек. Существует объяснение в книге дракона, но я никогда не находил это очень ясным, частично потому что книга дракона описывает очень общий случай синтаксического анализа по грамматике предшествования оператора. Но я не думаю, что Вы найдете это трудным.
Другой случай, которого Вы захотите остерегаться, - когда Вы имеете
prefix (e) postfix
где prefix
и postfix
имейте тот же приоритет. Этот случай также требует круглых скобок для разрешения неоднозначности.
Моя статья, Не анализирующая Выражения с Префиксными и Постфиксными операторами, имеет синтаксический анализатор в качестве примера в спине, и можно загрузить код, но это записано в ML, таким образом, его работы не могут быть очевидны для любителя. Но целый бизнес неподвижности и так далее объяснен в мельчайших подробностях.
Что Вы собираетесь сделать о порядке операций?
a * b squared
Вы могли бы хотеть проверить Scala, который имеет своего рода уникальный подход к операторам и методам.