2012-08-28 2 views
1

Ragel을 사용하여 간단한 Lexer를 작성하고 Java 유효한 코드로 출력하려고하지만 생성 된 코드가 컴파일되지 않습니다.Ragel에서 생성 된 Java 코드를 컴파일하는 중 오류가 발생했습니다. 12.

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

생성 된 파일과 오류 출력에 있습니다 : 내가 사용하는

가 여기에 Lexer.rl있어 https://gist.github.com/3495276 (이 여기에 붙여 너무 커서 때문에 = S)

그래서, 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

당신이 Ragel의 어떤 버전을 사용합니까해야 하는가? 143 번 줄이 이상하게 보입니다. '4'. 최신 ragel을 사용할 때이 "4"를 얻지 못합니다. 6.7 –

+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_]*; 
관련 문제