1

Ragel を使用して単純なレクサーを作成し、それを Java の有効なコードに出力しようとしていますが、生成されたコードはコンパイルされません。

私が使用している Lexer.rl は次のとおりです。

public class Lexer {
    %%{
      machine simple_lexer;

      integer     = ('+'|'-')?[0-9]+;
      float       = ('+'|'-')?[0-9]+'.'[0-9]+;
      assignment  = '=';
      identifier  = [a-zA-Z][a-zA-Z_]+; 

      main := |*
        integer => { emit("integer"); };
        float => { emit("float"); };
        assignment => { emit("assignment"); };
        identifier => { emit("identifier"); };
        space => { emit("space"); };
      *|;

    }%%

    %% write data;

    public static void emit(String token) {
        System.out.println(token);
    }

    public static void main(String[] args) {
        %% write init;

        %% write exec;
    }
}

生成されたファイルとエラー出力は次の場所にあります: https://gist.github.com/3495276 (大きすぎてここに貼り付けられないため =S )

それで、私は何を間違っていますか?

4

1 に答える 1

3

生成されたコードで使用される特定の変数を宣言する必要があります。ユーザーガイドのセクション 5.1「Ragel が使用する変数」を参照してください。

main次のようになります。

public static void main(String[] args) {
    int cs; /* state number */
    char[] data = "xy = 22 wq = 11.46".toCharArray(); /* input */
    int p = 0, /* start of input */
        pe = data.length, /* end of input */
        eof = pe,
        ts, /* token start */
        te, /* token end */
        act /* used for scanner backtracking */;

    %% write init;

    %% write exec;
}

また、識別子を少なくとも 2 シンボルの長さにすることが本当に必要かどうかもわかりません。

identifier  = [a-zA-Z][a-zA-Z_]+;

おそらくそうあるべきです

identifier  = [a-zA-Z][a-zA-Z_]*;
于 2012-08-28T16:33:40.817 に答える