J'étudie la théorie et la pratique du compilateur pour le moment. Ruby est mon langage de tous les jours, et je suis donc allé voir sa grammaire et son langage. Est-ce que ruby a un lexer séparé? Si oui, dans quel fichier est-il décrit?Analyse lexicale en IRM Ruby 1.9.2
3
A
Répondre
1
Dans la source de rubis, il y a le fichier parse.y
qui contient la grammaire. Je suis relativement sûr que ruby utilise une lexer séparée (comme la plupart des parseurs LR). il semble aussi que le lexer est stateful:
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. */
};
Je suppose que cela nécessaire, car une nouvelle ligne est ignorée dans certains cas et dans d'autres cas, il met fin à des expressions, etc. « classe » ne sont pas toujours aussi un mot-clé comme par exemple dans 'x.class'.
Mais je ne suis pas un expert.
EDIT: Vous cherchez plus dans le fichier parse.y le lexer est pas complètement séparé de l'analyseur:
superclass : //[...]
| '<'
{
lex_state = EXPR_BEG;
}