gpt4 book ai didi

antlr - 防火墙配置解析器无关输入

转载 作者:行者123 更新时间:2023-12-04 09:52:14 30 4
gpt4 key购买 nike

我正在尝试为某些防火墙设备编写配置解析器。我是第一次使用 ANTLR。

我想要解析的通常是以下类型的文本:

config wireless-controller global
set name ''
set location ''
set max-retransmit 3
set data-ethernet-II disable
set link-aggregation disable
set mesh-eth-type 8755
set fiapp-eth-type 5252
set discovery-mc-addr 221.0.4.254
set max-clients 0
set rogue-scan-mac-adjacency 6
set ipsec-base-ip 172.252.0.4
set wtp-share disable
set ap-log-server disable
set ap-log-server-ip 0.0.0.0
set ap-log-server-port 0
end

输入数据是带有配置行的“config”块。我已经想出了这些规则:
   1   │ grammar Fortigate ;
2 │
3 │ /*
4 │ * Tokens
5 │ */
6 │
7 │ WHITESPACE : (' ' | '\t')+ -> skip ;
8 │ NEWLINE : ('\r'? '\n' | '\n' | '\r')+ ;
9 │ WORD : ([a-zA-Z0-9] | '.' | [\-_'"])+ ;
10 │ ENDBLOCK : 'end' ;
11 │ EDITSTART : 'edit' ;
12 │ NEXTEDIT : 'next' ;
13 │ /*
14 │ * Parser rules
15 │ */
16 │ configline : ('set'|'unset') WORD+ NEWLINE ;
17 │ startconfigblock : 'config' WORD+ NEWLINE ;
18 │ editline : EDITSTART '"'.+?'"' ;
19 │ editblock : editline configline+ NEXTEDIT NEWLINE ;
20 │ configblock : startconfigblock (editblock | configline)+ ENDBLOCK NEWLINE;
21 │
22 │ startRule : configblock+ ;

我仍然有问题,因为 antlr 似乎不喜欢然后结束要解析的数据的“end\n”: line 12:0 extraneous input 'end' expecting {'set', 'unset', 'end', 'edit'}
但是我有很干净的 token 树
antlr4 Fortigate startRule -gui

Antlr 不喜欢结尾的“结束”文本,尽管它在 configblock 中规则,它不会被另一个规则消耗......

谢谢你的帮助 !

最佳答案

输入 end被标记为 WORD .这是因为当词法分析器可以为多个规则匹配相同的字符时,第一个定义的“获胜”。解决办法,把关键字移到你的WORD上面规则:

ENDBLOCK    : 'end' ;
EDITSTART : 'edit' ;
NEXTEDIT : 'next' ;
WORD : ([a-zA-Z0-9] | '.' | [\-_'"])+ ;

如果您想匹配 end也作为 WORD ,然后引入这样的解析器规则:
word
: WORD
| END
;

并使用此 word在您的解析器规则中而不是 WORD .

顺便说一句, ([a-zA-Z0-9] | '.' | [\-_'"])+可以改写为 [a-zA-Z0-9.\-_'"]+(' ' | '\t')+[ \t]+ .

最后,用 EOF“ anchor 定”解析器的开始规则总是一个好主意。 token :这样你就迫使解析器消耗整个 token 流而不是中途停止。

关于antlr - 防火墙配置解析器无关输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61997146/

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