1

我正在尝试使用 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 )

那么,我做错了什么?

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;
}

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

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

可能应该是

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