编译Ragel 6.7生成的java代码时出错

时间:2012-08-28 05:47:46

标签: java compiler-construction ragel

我正在尝试使用Ragel编写一个简单的Lexer,并将其输出到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)

那么,我做错了什么?

1 个答案:

答案 0 :(得分: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;
}

另外,不确定您是否真的希望标识符长度至少为两个符号。

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

可能应该是

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