Как отличить унарный минус от бинарного
Желательно отличить унарный минус от бинарного уже на этапе лексического анализа, чтобы синтаксическому анализатору выдать готовое решение.
Минус является унарным в следующих случаях:
Минус является бинарным в следующих случаях:
Опубликовано: 2016.06.01, последняя правка: 2018.10.29 15:54
Отзывы
✅ 2016/06/03 04:34, rst256 #0
лексема в строке — первая (после конца строки) x = (if x==y -a else -b) это же Statement будет, а не expression! Распознается как бинарный ((х==у)-б), если без костыля с '\13', или как непонятно что (ибо выражению нечего делать в области Statement'ов, особенно если после if не используется then).✅ 2016/06/03 12:14, Автор сайта #1
Конец строки (точнее — «конец выражения») после условия должен быть обязательно. А конец строки — это либо 16"0d0a", либо точка с запятой. Приведённый пример можно оформить и так:x = (if x==y; -a; else -b) ✅ 2016/11/06 08:06, rst256 #2
Вообще конкретно с операцией "-" достаточно того, что бинарный "-" может быть один и только в начале цепочки, постфиксной операции "--" ведь нет, префиксная не примет в качестве операнда результат от унарного "-" (---а), а двойное отрицание (- - а т.е. --а) очевидно и так не допустимо.✅ 2017/09/16 20:20, Comdiv #3
И тут непонятные усложнения в лексическом анализе. Минус — это минус, он не одиночный и не двоичный. Есть операции вычитания и смены знака, но минус они используют один и тот же. При желании можно вообще не выделять две операции при составлении грамматики:Сумма = [ + ! - ] Слагаемое { ( + ! - ) Слагаемое } . Лучше потренироваться на воплощении учебных языков прежде, чем думать о реализации основного.✅ 2017/09/16 23:30, Автор сайта #4
В С++ унарные «+» и «-» имеют приоритет 2. Бинарные же — приоритет 5. Понятно, что речь идёт о разных операциях. Соответственно их надо отличать. Можно это сделать на этапе лексического анализа, можно эту задачу отложить на потом. Как лучше? Лексический анализ всё-таки проще синтаксического. Поэтому, на мой взгляд, лучше утяжелить лексический анализ, облегчая и без того сложный синтаксический.✅ 2017/09/18 11:39, Comdiv #5
Здесь путаница операции и знака. Знак один и тот же, операции разные (или одинаковые, как в приведённой мною грамматике). Лексер выдаёт лексемы-знаки, парсер разбирает операции. Поскольку знак один и тот же, то и лексер должен выдавать одно и то же, а не мудрить. Речь не должна идти о том, что следует усложнить, потому что оно простое, а о том, что соответствует смыслу. Тогда общая сложность системы будет меньше. Именно это важно. Просто попробуйте на учебном языке и почувствуйте.✅ 2017/09/18 22:36, Автор сайта #6
Да, можно и попробовать и так, и сяк. А потом сравнить. Однако ж, если синтаксическому анализатору уже разжевали семантику минуса, разве это плохо?✅ 2017/09/20 02:00, Comdiv #7
Если работа уже сделана, то назад время, конечно, не вернуть. Если же нет, то можно упростить задачу. Но, может, Вы не ищете лёгких путей? Тогда можно и так.✅ 2018/05/28 18:34, Александр Коновалов aka Маздайщик #8
Автор сайта!
Кстати, да. Вы уже пробовали делать реализацию каких-нибудь мелких элементов входного языка чисто для проверки концепций? Не только back-end’а (про эксперименты с двумя стеками я знаю), но и front-end’а? Потому что можно написать, например, интерпретатор какого-нибудь подмножества и закодировать на нём простейшие алгоритмы (алгоритм Евклида, решение квадратных уравнений, сортировку пузырьком). И посмотреть, на сколько это удобно.✅ 2018/05/30 16:59, Автор сайта #9
Эксперименты на уровне лексем были. Но решил успокоить зуд и не тратить время на реализацию, пока язык не созрел в концепциях. Руки, конечно, чешутся, но программировать, а потом выкидывать наработанное в связи со сменой концепции — неразумно.✅ 2018/05/31 17:42, Comdiv #10
Так это называется прототипированием и оно вполне разумно.✅ 2018/09/29 10:01, utkin #11
Рассмотрите вариант — избавиться от унарного минуса. Для этого нужно считать это краткой записью операции с двумя параметрами:-а эквивалентно 0 - а И тогда никаких там кучи условий Вам не требуется, а реализация упрощается.✅ 2018/09/29 16:52, Автор сайта #12
Пожалуй, Вы правы, так вполне работоспособно. Правда, решение о классификации минуса будет перенесено на этап синтаксического анализа. А хотелось бы, чтобы об этом знал уже лексер. А так — почему бы и нет?
Но тут ещё надо иметь в виду, что могут быть и иные операции, которые могут быть и унарными, и бинарными. Помимо минуса в Си — это «*» «&», которые в бинарном варианте — умножение и побитовое «и», а в унарном — обращение по адресу и получение адреса. Конечно, лучше, когда унарные и бинарные операции не пересекаются. Но для минуса этого не избежать, слишком велика и живуча традиция использовать его в двух вариантах. Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|