gpt4 book ai didi

java - Antlr4 - 多行文件解析器 -

转载 作者:行者123 更新时间:2023-12-01 04:20:36 27 4
gpt4 key购买 nike

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

最佳答案

您需要将 NLWS 组合为一个 WS 元素,并使用 ->skip 跳过它(不是{skip()})

并且由于 WS 会自动跳过,因此无需在所有规则中指定它。

此外,您的 STRING 有一个空格 (' '),它导致了错误并占用了下一个输入。

这是完整的语法:

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

关于java - Antlr4 - 多行文件解析器 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18957321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com