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?

War es hilfreich?

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;
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top