Ruby: являются ли комментарии токенами?

#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, которые игнорируются.