[英]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的初學者,我不確定我是否真的了解它的工作原理! 謝謝你們 !
您需要將NL
和WS
合並為一個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文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.