Java Antlr4-多行文件解析器-

Java Antlr4-多行文件解析器-,java,antlr4,Java,Antlr4,我试图使用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 )*

我试图使用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
,因此无需在所有规则中指定它

另外,您的
字符串
有一个
空格
'
),这导致了错误并占用了下一个输入

这是您的完整语法:

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 ;

另外,我建议您浏览一下

非常感谢,这对我帮助很大。我的错误是将“[”和“]”放在字符串标记中,因为一个值可以包含一个数字,所以当我有类似“home[1]示例-1”的内容时,home可以解释为“home”或“value”。你的代码运行良好!谢谢你提供的跳过标签、空格和行尾的提示。