#ruby
#ruby
Вопрос:
Я только что прочитал здесь (http://ruby.runpaint.org/programs#lexical ) что комментарии являются токенами. Я никогда не думал о комментариях как о токенах, поскольку они либо являются аннотациями, либо предназначены для постпроцессора.
Комментарии действительно являются токенами или этот источник неверен?
Ответ №1:
Да, они должны быть токенами, но позже синтаксический анализатор их проигнорирует. Если вы делаете ruby --dump parsetree foo.rb
с файлом, который выглядит следующим образом
# this is a comment
1 1
# another comment
это то, что вы получите:
# @ NODE_SCOPE (line: 3)
# - nd_tbl: (empty)
# - nd_args:
# | (null node)
# - nd_body:
# @ NODE_CALL (line: 2)
# - nd_mid: :
# - nd_recv:
# | @ NODE_LIT (line: 2)
# | - nd_lit: 1
# - nd_args:
# @ NODE_ARRAY (line: 2)
# - nd_alen: 1
# - nd_head:
# | @ NODE_LIT (line: 2)
# | - nd_lit: 1
# - nd_next:
# (null node)
Ответ №2:
Да, они являются токенами для синтаксического анализатора. Обычно, если вы используете генератор синтаксического анализа, это определение комментария
{code} short_comment = '//' not_cr_lf* eol | '#' not_cr_lf* eol;
{code} long_comment = '/*' not_star* '*' (not_star_slash not_star* '*' )* '/'; /* '4vim */
Ignored Tokens
short_comment,
long_comment;
Это грамматика SableCC. Обычно это игнорируемые токены.
Помните, что все, что вы пишете в исходном коде, является токеном, это всегда первый шаг. Синтаксическому анализатору необходимо начать построение абстрактного синтаксического дерева из токенов.
Комментарии:
1. Спасибо. Тогда пробел тоже является маркером? У меня создалось впечатление, что пробел не был маркером, а просто влиял на распознавание других токенов.
2. Пробелы обычно игнорируются сканером (программой, генерирующей поток токенов). Конечно, существуют языки, в которых пробелы значимы, такие как Python и CoffeeScript.
3. Мэтти: это зависит от языка. Как сказал Кристоф, некоторые языки используют значительные пробелы. В этом случае вы обычно отслеживаете текущий уровень отступа и, например, добавляете новую область сверху, когда уровень увеличивается / убираете одну область, когда уровень уменьшается.
4. Я только что просмотрел черновик спецификации Ruby, и в этом случае кажется, что пробелы не считаются токеном, а обычно просто являются токенами-разделителями.
5. Это зависит от того, как вы пишете свой синтаксический анализатор. На самом деле вы могли бы быть более конкретными. например, в Python важными являются t и s, которые игнорируются.