2012-08-28 53 views
1

我試圖用Ragel編寫一個簡單的Lexer,並將其輸出到Java有效代碼,但生成的代碼不能編譯。編譯由Ragel生成的Java代碼時出錯6.7

這裏的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)

所以,我究竟做錯了什麼?

+0

你使用哪種版本Ragel的? 143行看起來很奇怪:'4'。當使用最新的ragel 6.7時,我沒有得到這個「4」。 –

+0

我目前使用Ragel 6.2 –

回答

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_]*;