2013-09-23 33 views
1

我想使用antlr4來解析ssh命令結果,但我無法弄清楚爲什麼這段代碼不起作用,我不斷收到「無關輸入」錯誤。Antlr4 - 多行文件解析器 -

下面是該文件的樣本,我試圖解析:

system 
home[1] HOME-NEW 
    sp 
    cpu[1] 
    cpu[2] 
home[2] SECOND-HOME 
    sp 
    cpu[1] 
    cpu[2] 

這裏是我的語法文件:

listAll 
    : (system | home | NL)* 
    ; 

elements 
    : (sp | cpu)* 
    ; 

home 
    : 'home[' number ']' value NL elements 
    ; 

system 
    : 'system' NL 
    ; 

sp 
    : 'sp' NL 
    ; 

cpu 
    : 'cpu[' number ']' NL 
    ; 

value 
    : VALUE 
    ; 

number 
    : INT 
    ; 

VALUE : STRING+; 
STRING: ('a'..'z'|'A'..'Z'| '-' | ' ' | '(' | ')' | '/' | '.' | '[' | ']'); 
INT : ('0'..'9')+ ; 
NL : '\r'? '\n'; 
WS :  (' '|'\t')* {skip();} ; 

的切入點是 'listAll'。 下面是結果我得到:

(listAll \r\n (system system \r\n) home[1] HOME-NEW \r\n sp \r\n cpu[1] \r\n cpu[2] \r\n[...]) 

解析「系統」後失敗。我得到這個錯誤: 行2:1無關輸入'家'[1]家新'期待{,系統',NL,WS}

有誰知道爲什麼這不工作? 我是Antlr的初學者,我不確定我真的明白它是如何工作的! 謝謝大家!

回答

0

您需要NLWS結合爲一體WS元素,並使用-> skip(不{skip()}

跳過它,因爲WS將自動跳過,沒有必要在所有的規則中指定。

此外,您的STRING有一個space' ')這是導致錯誤,並佔用下一個輸入。

下面是完整的語法:

listAll : (system | home)* ; 

elements : (sp | cpu)* ; 

home  : 'home[' number ']' value elements; 

system : 'system' ; 

sp  : 'sp' ; 

cpu  : 'cpu[' number ']' ; 

value  : VALUE ; 

number : INT ; 

VALUE  : STRING+; 

STRING : ('a'..'z'|'A'..'Z'| '-' | '(' | ')' | '/' | '.' | '[' | ']') ; 

INT  : [0-9]+ ; 

WS  : [ \t\r\n]+ -> skip ; 

此外,我會建議你去通過ANTLR4 Documentation

+0

非常感謝你,這對我幫助很大。我的錯誤是將'['和']'放在STRING標記中,因爲一個值可以包含一個數字,所以當我有'home [1] EXAMPLE-1'之類的東西時,家可以被解釋爲'家'或'價值'。你的代碼工作正常!並感謝提示跳過標籤,空間和行結束。 – zaphod

+0

很高興幫助:) –