1

我正在尝试使用 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 的初学者,我不确定我是否真的了解它的工作原理!谢谢你们 !

4

1 回答 1

0

您需要将NLand组合WS为一个WS元素并使用-> skip(not {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 文档

于 2013-09-23T11:22:22.290 回答