Как написать ANTLR грамматику для анализа простого текстового файла - PullRequest
0 голосов
/ 21 октября 2019

Я очень новичок в этом инструменте ANTLR. Нужна помощь в написании правил грамматики в ANTRL, для преобразования / анализа обычного текста в эквивалентный XML-файл с использованием Java. Пожалуйста, помогите мне в этом.

Я пытался, как показано ниже, в соответствии с моим пониманием, и это работает для одной строки (парсер), а не для полного configList (парсер)

ANTLR грамматиканиже приведены правила моей грамматики .g4

grammar MyTest;

acl : 'acl number' INT configList ('#' configList)* ;
configList  :  config ('\n' config)*;

config : line ('\n' line)* ;

line : line WORD INT (WORD)+ ((SOURCE_LOW_IP)* |(WORD)* |(SOURCE_LOW_IP)*)+
        |WORD INT (WORD)+
;  

fragment
DIGIT   :   ('0'..'9');
INT :   [0-9]+ ;             // Define token INT as one or more digits
//WORD :  [A-Za-z][A-Za-z_\-]* ;
WORD : [A-Za-z][A-Za-z_\-]* ;
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t\r\n]+ -> skip ; // toss out whitespace

SOURCE_LOW_IP : INT '.' INT '.' INT '.' INT ; // match IPs in parser

пример ввода списка конфигурации:


acl number 3001</p> <p>rule 0 permit ip source any rule 1 permit ip source 172.16.10.1 # rule 2 permit ip source 172.16.10.2 0.0.0.255 rule 3 deny destination any rule 4 deny destination 172.16.10.4 rule 5 deny destination 172.16.10.5 0.0.0.255 # rule 6 permit ip source any destination 172.16.10.6 0.0.0.255 rule 7 permit ip source 172.16.10.7 0.0.0.255 destination 172.16.11.7 # </p> <p>expected for output format as below( this will be taken care using java once antlr generates .java and other files) </p> <pre> <filterRuleLists> <filterRuleList id='3001'> <filterRule action='ALLOW' protocol='ANY'> <sourceIPRange low='0.0.0.0' high='255.255.255.255' /> <destinationIPRange low='0.0.0.0' high='255.255.255.255' /> <fileLine file='config' startLine='4' stopLine='4' /> </filterRule> <filterRule action='ALLOW' protocol='ANY'> <sourceIPRange low='172.16.10.1' high='172.16.10.1' /> <destinationIPRange low='0.0.0.0' high='255.255.255.255' /> <fileLine file='config' startLine='5' stopLine='5' /> </filterRule> </filterRuleList> </filterRuleLists>

1 Ответ

2 голосов
/ 21 октября 2019

Я знаком с генераторами синтаксических анализаторов, но не с ANTLR4, в частности, так что это лучшее предположение: я сильно подозреваю, что грамматические правила

configList : config ('\n' config)*;
config : line ('\n' line)* ;

следует переписать как

configList : config (NEWLINE config)*;
config : line (NEWLINE line)* ;

как правило фрагмента

NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)

приведет к обработке любых символов '\n' в токенах NEWLINE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...