簡體   English   中英

Antlr4-多行文件解析器-

[英]Antlr4 - Parser for multi line file -

我正在嘗試使用antlr4解析ssh命令結果,但是我無法弄清楚為什么此代碼不起作用,我不斷收到“外部輸入”錯誤。

這是我要解析的文件的示例:

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行多余的輸入'home [1] HOME-NEW'期望{,system',NL,WS}

有人知道為什么這不起作用嗎? 我是Antlr的初學者,我不確定我是否真的了解它的工作原理! 謝謝你們 !

您需要將NLWS合並為一個WS元素,並使用-> skip (不是{skip()} )跳過它

並且由於將自動跳過WS ,因此無需在所有規則中都指定它。

另外, STRINGspace' ' )導致了錯誤並占用了下一個輸入。

這是您完整的語法:

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文檔

暫無
暫無

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

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