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