我正在尝试使用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[...])
'system'后解析失败。我收到这个错误: 第2行:1个无关输入'home [1] HOME-NEW'期待{,system',NL,WS}
有人知道为什么这不起作用吗? 我是Antlr的初学者,我不确定我是否真的理解它是如何工作的! 谢谢大家!
答案 0 :(得分:0)
您需要将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 Documentation