2014-04-16 54 views
0
grammar CSVParser; 
// 

table : line+; 

line : NAME 
',' PEAK ',' 
STARTYEAR ',' 
ENDYEAR ',' LENGTH NEWLINE 
; 

NEWLINE : '\r'? '\n' 
     ; 

NAME : ('"'(~'"')*'"') 
; 

PEAK : ([0-9]+); 

STARTYEAR : ([0-9]+); 

ENDYEAR : ([0-9]+); 

LENGTH : [0-9]+; 

正如你所看到的,我想解析一個CSV表是這樣的:在C#中antlr4解析器---似乎是正確的,但不能正常工作

"ANNUAL REVIEW OF IMMUNOLOGY, VOL 31",0,0,1,1 
"",0,0,1,1 
"CA-A CANCER JOURNAL FOR CLINICIANS",1,1,2,1 
"NATURE CHEMISTRY",1,1,3,2 
"NATURE PHOTONICS",1,1,3,2 
"ANNUAL REVIEW OF IMMUNOLOGY, VOL 30",1,1,2,1 
"PHYSICS TODAY",2,1,3,2 
"NATURE BIOTECHNOLOGY",2,2,4,2 
"CHEMICAL SOCIETY REVIEWS",2,1,3,2 
"NATURE REVIEWS GENETICS",2,2,3,1 

但也有例外:

line 1:40 mismatched input '0' expecting STARTYEAR 
line 2:5 mismatched input '0' expecting STARTYEAR 
line 3:39 mismatched input '1' expecting STARTYEAR 
line 4:21 mismatched input '1' expecting STARTYEAR 
line 5:21 mismatched input '1' expecting STARTYEAR 
line 6:40 mismatched input '1' expecting STARTYEAR 
line 7:18 mismatched input '1' expecting STARTYEAR 
line 8:25 mismatched input '2' expecting STARTYEAR 
line 9:29 mismatched input '1' expecting STARTYEAR 
line 10:28 mismatched input '2' expecting STARTYEAR 
line 11:31 mismatched input '2' expecting STARTYEAR 
line 12:42 mismatched input '2' expecting STARTYEAR 
line 13:19 mismatched input '1' expecting STARTYEAR 
line 14:40 mismatched input '2' expecting STARTYEAR 
line 15:34 mismatched input '2' expecting STARTYEAR 
line 16:29 mismatched input '2' expecting STARTYEAR 
line 17:40 mismatched input '2' expecting STARTYEAR 
line 18:40 mismatched input '2' expecting STARTYEAR 
line 19:43 mismatched input '2' expecting STARTYEAR 
line 20:40 mismatched input '3' expecting STARTYEAR 

怎麼回事?

哦,Stackoverflow告訴我添加更多細節。但我認爲這裏的代碼足夠了,因爲這裏顯示了csv文件。

回答

2

許多詞法分析規則都是相同的。當匹配[0-9]+時,將只創建一個PEAK,而不會創建STARTYEAR,ENDYEARLENGTH。詞法分析器不會根據解析器「需要」創建令牌。

做這樣的事情,而不是:

grammar CSVParser; 

table  : line+ EOF; 
line  : NAME ',' peak ',' startyear ',' endyear ',' length NEWLINE; 
peak  : NUMBER;  
startyear : NUMBER; 
endyear : NUMBER;  
length : NUMBER; 

NEWLINE : '\r'? '\n'; 
NAME  : '"' (~'"')* '"'; 
NUMBER : [0-9]+; 
+0

謝謝!我後來發現問題。 – zsf222

相關問題