3

現在、コンパイラの理論と実践を学んでいます。Ruby は私が日常的に選んでいる言語なので、そのレクサーと構文解析を調べてみました。ルビーには別のレクサーがありますか? もしそうなら、それはどのファイルに記述されていますか?

4

1 に答える 1

1

ルビーソースには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. */
};

改行が無視される場合もあれば、式などを終了する場合もあるため、これが必要だと思います。また、「class」は、たとえば「x.class」のようなキーワードであるとは限りません。

しかし、私は専門家ではありません。

編集:parse.yファイルを詳しく見ると、レクサーはパーサーから完全に分離されていません。

superclass  : //[...]
    | '<'
        {
        lex_state = EXPR_BEG;
        }
于 2010-10-25T18:03:02.263 に答える