Лексический анализ в МРТ Ruby 1.9.2 - PullRequest
3 голосов
/ 25 октября 2010

Я изучаю теорию и практику компиляции в данный момент. Ruby - мой любимый язык на каждый день, поэтому я решил взглянуть на его лексер и разобрать грамматику. У ruby ​​есть отдельный лексер? Если да, то в каком файле он описан?

1 Ответ

1 голос
/ 25 октября 2010

В источнике ruby ​​есть файл parse.y, который содержит грамматику. Я относительно уверен, что ruby ​​использует отдельный лексер (как и большинство парсеров LR). Кроме того, похоже, что лексер с состоянием:

enum lex_state_e {
EXPR_BEG,           /* ignore newline, +/- is a sign. */
EXPR_END,           /* newline significant, +/- is an operator. */
EXPR_ENDARG,        /* ditto, and unbound braces. */
EXPR_ARG,           /* newline significant, +/- is an operator. */
EXPR_CMDARG,        /* newline significant, +/- is an operator. */
EXPR_MID,           /* newline significant, +/- is an operator. */
EXPR_FNAME,         /* ignore newline, no reserved words. */
EXPR_DOT,           /* right after `.' or `::', no reserved words. */
EXPR_CLASS,         /* immediate after `class', no here document. */
EXPR_VALUE          /* alike EXPR_BEG but label is disallowed. */
};

Я полагаю, что это необходимо, поскольку в некоторых случаях символ новой строки игнорируется, а в других случаях он завершает выражения и т. Д. Также «класс» не всегда является ключевым словом, например, например в «x.class».

Но я не эксперт.

РЕДАКТИРОВАТЬ: Если заглянуть глубже в файл parse.y, лексер не полностью отделен от парсера:

superclass  : //[...]
    | '<'
        {
        lex_state = EXPR_BEG;
        }
...