我正在尝试使用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)
那么,我做错了什么?
答案 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_]*;