В источнике 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;
}