Операторы и методы в Ruby - PullRequest
       30

Операторы и методы в Ruby

7 голосов
/ 13 февраля 2010

Большинство вещей, которые выглядят как операторы, являются методами в Ruby; 1 + 2 является синтаксическим сахаром для 1.+(2).

Несмотря на то, что + и * являются методами, которые программа может переопределить, в Ruby есть специальная магия для оценки 1 + 2 * 3 как 1.+(2.*(3)) вместо 1.+(2).*(3).

Интересно, где эта особая магия живет в Руби, если она встроена в интерпретатор?

Ари.

Ответы [ 3 ]

10 голосов
/ 14 февраля 2010

Во всех реализациях Ruby приоритет оператора обрабатывается синтаксическим анализатором. Поскольку практически все существующие реализации Ruby используют один и тот же синтаксический анализатор или синтаксический анализатор, сгенерированный из той же грамматики YACC, parse.y в YARV - это файл, который вы хотите просмотреть . (Например, в JRuby этот файл по сути одинаков: src/org/jruby/parser/Ruby19Parser.y. То же самое для IronRuby: Merlin/Main/Languages/Ruby/Ruby/Compiler/Parser/Parser.y.)

Единственные четыре реализации Ruby, которые не , либо используют синтаксический анализатор YARV напрямую, либо используют синтаксический анализатор, сгенерированный клоном YACC из parse.y YARV, это Cardinal, tinyrb, RubyGoLightly и XRuby.

Cardinal - это реализация Ruby для виртуальной машины Parrot, и, поскольку Parrot включает в себя движок грамматики Parrot, Cardinal, естественно, использует его. Интересный файл src/parser/grammar.pg. PGE - это гибридный синтаксический анализатор / анализатор приоритета синтаксического анализатора с рекурсивным спуском, что означает, что приоритет файла довольно хорошо проявляется в файле грамматики.

Tinyrb использует PEG-парсер, использующий библиотеку ног Ian Piumarta. Как это типично для анализаторов PEG, таблица приоритетов операторов отсутствует, скорее приоритет подразумевается в иерархической структуре грамматики. Подробнее см. vm/grammar.leg. RubyGoLightly является производным от tinyrb, за исключением того, что он использует Go вместо C в качестве языка реализации, но использует ту же грамматику PEG.

XRuby использует ANTLR для своего парсера. Здесь интересный файл src/com/xruby/compiler/parser/ruby.g.

Рубиниус использует парсер Melbourne, который по сути является парсером YARV, упакованным как расширение C. MagLev использует ruby_parser (см. Ниже).

Помимо реализаций Ruby, есть и другие парсеры Ruby.

ruby_parser Райана Дэвиса получен из грамматики YARV YACC. Он использует racc в качестве генератора парсера. См. lib/ruby_parser.y.

Калеб Клаузен RedParse использует собственный рукописный интерпретатор компилятора Калеба. Интересный файл lib/redparse/babyparser.rb.

Это все парсеры, которые я знаю, которые на самом деле обрабатывают приоритет операторов. Есть еще один синтаксический анализатор, встроенный в RDoc, и он был в YARD (теперь он использует RedParse), но он обрабатывает только синтаксис Ruby, достаточный для поиска модулей, классов и методов, комментариев и извлечения списков параметров методов. Они не имеют дело с приоритетом оператора.

2 голосов
/ 13 февраля 2010

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

0 голосов
/ 13 февраля 2010

Да, это аппаратно, поэтому вы не можете добавлять новые операторы или изменять приоритет существующих операторов.

...