簡體   English   中英

Ragel Java輸出[nulla,b]而不是[a,b,c]

[英]Ragel Java outputs [nulla,b] instead of [a,b,c]

我想在ragel中編寫CSVReader狀態機,因為我已經使用Enums在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()));
}
}

這就是它給我的回報: [nulla, b]

縱觀此,我看到兩個問題。 第一個是輸出開始處的null,我認為這是由於解析開始時未初始化string導致的,因此將其null emit調用到達string += output; stringnull ,因此它將當前標記(“ a”)附加到null的字符串表示形式中,結果為“ nulla”。 ""初始化string將解決此問題。

第二個問題,就是不將“ c”添加到列表中的問題,甚至更加簡單。 僅當找到分隔符時,令牌才會添加到列表中,並且由於“ c”后沒有分隔符,因此不會添加該令牌。 你可以通過調用檔案結尾的行動來解決這個emit當前令牌字符串,如果它不是空的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM