Lexikalische Analyse in MRI Ruby-1.9.2
-
26-09-2019 - |
Frage
Ich lerne einige Compiler Theorie und Praxis im Moment. Ruby ist meine täglich Sprache der Wahl, und so ging ich an seinem Lexer und Parse-Grammatik zu suchen. Hat Rubin eine separate Lexer? Wenn ja, welche Datei es beschrieben in?
Lösung
In der Ruby-Quelle gibt es die parse.y
-Datei, die die Grammatik enthält. Ich bin relativ sicher, dass Ruby eine separate Lexer (wie die meisten LR-Parser) verwendet. Auch scheint es, wie die Lexer ist 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. */
};
ich denke, dies für notwendig, weil ein Newline in einigen Fällen ignoriert und in anderen Fällen enden Ausdrücke etc. Auch ‚Klasse‘ ist nicht immer ein Stichwort wie z.B. in 'x.class'.
Aber ich bin kein Experte.
EDIT: Auf der Suche tiefer in der parse.y Datei wird die Lexer nicht vollständig aus dem Parser trennen:
superclass : //[...]
| '<'
{
lex_state = EXPR_BEG;
}