Antlr4 - 多行文件解析器 -

Posted

技术标签:

【中文标题】Antlr4 - 多行文件解析器 -【英文标题】:Antlr4 - Parser for multi line file - 【发布时间】:2013-09-23 10:46:35 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您需要将NLWS 组合为一个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

【讨论】:

非常感谢,这对我帮助很大。我的错误是将 '[' 和 ']' 放在 STRING 标记中,因为一个值可以包含一个数字,所以当我有类似 'home[1]EXAMPLE-1' 之类的东西时,home 可以解释为 'home'或“价值”。您的代码工作正常!感谢您提供跳过制表符、空格和行尾的提示。

以上是关于Antlr4 - 多行文件解析器 -的主要内容,如果未能解决你的问题,请参考以下文章

2.antlr4开发

2.antlr4开发

2.antlr4开发

Antlr4,如何报告特定的语法错误

1.ANTLR4 helloworld基础开发与IDEA插件使用

1.ANTLR4 helloworld基础开发与IDEA插件使用