Во всех реализациях 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, достаточный для поиска модулей, классов и методов, комментариев и извлечения списков параметров методов. Они не имеют дело с приоритетом оператора.