Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Как отличить унарный минус от бинарного

Желательно отличить унарный минус от бинарного уже на этапе лексического анализа, чтобы синтаксическому анализатору выдать готовое решение.

Минус является унарным в следующих случаях:

  • если ему предшествует бинарная операция – как в непрерывной цепочке, так и отделённая пробельными символами
    x =- y
    m *= - n
    a <<< - n
    
  • после запятой
    (x, y, -z)	
    {1, -a, b}
    
  • после ключевого слова
    return –z
    if -w == v
    
  • лексема в строке – первая (после конца строки)
    x = (if x==y
        -a
    else
       -b)
    
  • лексема в выражении – первая
    х = а * (-b)
    z = c [-d]
    
Минус является бинарным в следующих случаях:
  • после идентификатора
    a = identifier - b
    
  • после числового литерала
    a = 2 - b
    
  • после закрывающей скобки
    y = f(x) - а
    z = m[n] - а
    

Последняя правка: 2016-06-01    16:52

ОценитеОценки посетителей
   ▌ 0
   ▌ 0
   ▌ 0
   ██████████████████████████████████████████ 2 (100%)

Отзывы

     2016/06/03 04:34, rst256

лексема в строке – первая (после конца строки)
x = (if x==y
-a
else
-b)

это же Statement будет, а не expression! Распознается как бинарный ((х==у)-б), если без костыля с '\13', или как непонятно что (ибо выражению нечего делать в области Statement'ов, особенно если после if не используется then).

     2016/06/03 12:14, Автор сайта

Конец строки (точнее – «конец выражения») после условия должен быть обязательно. А конец строки – это либо 16"0d0a", либо точка с запятой. Приведённый пример можно оформить и так:
x = (if x==y; -a; else -b)

     2016/11/06 08:06, rst256

Вообще конкретно с операцией "-" достаточно того, что бинарный "-" может быть один и только в начале цепочки, постфиксной операции "--" ведь нет, префиксная не примет в качестве операнда результат от унарного "-" (---а), а двойное отрицание (- - а т.е. --а) очевидно и так не допустимо.

     2017/09/16 20:20, Comdiv

И тут непонятные усложнения в лексическом анализе. Минус - это минус, он не одиночный и не двоичный. Есть операции вычитания и смены знака, но минус они используют один и тот же.
При желании можно вообще не выделять две операции при составлении грамматики:

Сумма = [ + ! - ] Слагаемое { ( + ! - ) Слагаемое } .

Лучше потренироваться на воплощении учебных языков прежде, чем думать о реализации основного.

     2017/09/16 23:30, Автор сайта

В С++ унарные «+» и «-» имеют приоритет 2. Бинарные же – приоритет 5. Понятно, что речь идёт о разных операциях. Соответственно их надо отличать. Можно это сделать на этапе лексического анализа, можно эту задачу отложить на потом. Как лучше? Лексический анализ всё-таки проще синтаксического. Поэтому, на мой взгляд, лучше утяжелить лексический анализ, облегчая и без того сложный синтаксический.

     2017/09/18 11:39, Comdiv

Здесь путаница операции и знака. Знак один и тот же, операции разные (или одинаковые, как в приведённой мною грамматике). Лексер выдаёт лексемы-знаки, парсер разбирает операции. Поскольку знак один и тот же, то и лексер должен выдавать одно и то же, а не мудрить. Речь не должна идти о том, что следует усложнить, потому что оно простое, а о том, что соответствует смыслу. Тогда общая сложность системы будет меньше. Именно это важно. Просто попробуйте на учебном языке и почувствуйте.

     2017/09/18 22:36, Автор сайта

Да, можно и попробовать и так, и сяк. А потом сравнить. Однако ж, если синтаксическому анализатору уже разжевали семантику минуса, разве это плохо?

     2017/09/20 02:00, Comdiv

Если работа уже сделана, то назад время, конечно, не вернуть. Если же нет, то можно упростить задачу. Но, может, Вы не ищете лёгких путей? Тогда можно и так.

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Надо ли использовать YACC, LEX и подобные инструменты

Выбор кодировки для компилятора

Раскрутка компилятора

Лексический анализатор

●  Разбор цепочек знаков операций

●  Как отличить унарный минус от бинарного

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Последние комментарии

2018/04/16 15:09, Олег
Русский язык и программирование

2018/04/02 22:42, rst256
Программирование без программистов — это медицина без врачей

2018/03/25 21:14, Денис Будяк
Энтузиасты-разработчики компиляторов и их проекты

2018/03/21 23:37, Marat
Почему обречён язык Форт

2018/03/10 20:05, Comdiv
«Двухмерный» синтаксис Python

2018/02/24 14:51, Эникейщик
Русской операционной системой должна стать ReactOS

2017/12/12 13:32, Comdiv
Отечественные разработки

2017/11/05 17:26, rst256
Электроника без электронщиков