Ragel Java 输出 [nulla,b] 而不是 [a,b,c]
Ragel Java outputs [nulla,b] instead of [a,b,c]
我想用 ragel 编写一个 CSVReader 状态机,因为我已经在 Java 中用枚举完成了我的代码。返回的列表应该是 [a,b,c] 但我得到 [nulla,b]。我在 Fedora 22 上使用 Ragel 6.8,我真的希望有人能帮助我
这是来源:
%%{
machine csv_reader_java;
seperator = (';'|',');
letter = [A-Za-z0-9]*;
main := |*
seperator => { putToList(tokens, string); };
letter => { emit(data, tokens, ts, te); };
space;
*|;
}%%
import java.util.*;
public class CSVReader {
private String string;
public void emit(char[] data, List<String> tokens, int ts, int te) {
char output = data[ts];
string += output;
}
public void putToList(List<String> tokens, String data){
tokens.add(data);
string = "";
}
%% write data;
public List<String> split(char[] data) {
int cs; /* state number */
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 */;
List<String> tokens = new ArrayList<String>();
%% write init;
%% write exec;
return tokens;
}
public static void main(String[] args) {
System.out.println(new CSVReader().split("a,b,c".toCharArray()));
}
}
这就是 returns 我:
[nulla, b]
看了这个,我发现了两个问题。第一个是输出开始处的 null,我认为这是由于在解析开始时未初始化 string
造成的,它留下 null
。当 emit
调用到达 string += output;
时,string
是 null
,因此它将当前标记 ("a") 附加到 null
的字符串表示形式,导致 "nulla"。用 ""
初始化 string
可以解决这个问题。
第二个问题,即不将 "c" 添加到列表中的问题,更简单。只有在找到分隔符时,标记才会添加到列表中,并且由于 "c" 之后没有分隔符,因此不会添加该标记。如果当前标记字符串不为空,您可以通过对 end-of-file 调用一个操作来解决此问题 emit
。
我想用 ragel 编写一个 CSVReader 状态机,因为我已经在 Java 中用枚举完成了我的代码。返回的列表应该是 [a,b,c] 但我得到 [nulla,b]。我在 Fedora 22 上使用 Ragel 6.8,我真的希望有人能帮助我
这是来源:
%%{
machine csv_reader_java;
seperator = (';'|',');
letter = [A-Za-z0-9]*;
main := |*
seperator => { putToList(tokens, string); };
letter => { emit(data, tokens, ts, te); };
space;
*|;
}%%
import java.util.*;
public class CSVReader {
private String string;
public void emit(char[] data, List<String> tokens, int ts, int te) {
char output = data[ts];
string += output;
}
public void putToList(List<String> tokens, String data){
tokens.add(data);
string = "";
}
%% write data;
public List<String> split(char[] data) {
int cs; /* state number */
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 */;
List<String> tokens = new ArrayList<String>();
%% write init;
%% write exec;
return tokens;
}
public static void main(String[] args) {
System.out.println(new CSVReader().split("a,b,c".toCharArray()));
}
}
这就是 returns 我:
[nulla, b]
看了这个,我发现了两个问题。第一个是输出开始处的 null,我认为这是由于在解析开始时未初始化 string
造成的,它留下 null
。当 emit
调用到达 string += output;
时,string
是 null
,因此它将当前标记 ("a") 附加到 null
的字符串表示形式,导致 "nulla"。用 ""
初始化 string
可以解决这个问题。
第二个问题,即不将 "c" 添加到列表中的问题,更简单。只有在找到分隔符时,标记才会添加到列表中,并且由于 "c" 之后没有分隔符,因此不会添加该标记。如果当前标记字符串不为空,您可以通过对 end-of-file 调用一个操作来解决此问题 emit
。