【问题标题】:how to write ANTLR grammar for parsing plain text file如何编写用于解析纯文本文件的 ANTLR 语法
【发布时间】:2019-10-21 12:04:15
【问题描述】:

我对这个 ANTLR 工具非常陌生,需要帮助在 ANTRL 中编写语法规则,用于使用 java 将纯文本转换/解析为等效的 .xml 文件。 请任何人帮助我。

根据我的理解,我尝试如下,它适用于单行(解析器)而不是完整的 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

规则 0 允许 ip 源任何 规则 1 允许 ip 源 172.16.10.1 # 规则 2 允许 ip 源 172.16.10.2 0.0.0.255 规则 3 拒绝目的地任何 规则 4 拒绝目的地 172.16.10.4 规则 5 拒绝目的地 172.16.10.5 0.0.0.255 # 规则 6 允许 ip 源任何目标 172.16.10.6 0.0.0.255 规则 7 允许 ip 源 172.16.10.7 0.0.0.255 目标 172.16.11.7 #

预期输出格式如下(一旦antlr生成.java和其他文件,使用java会注意这一点)

 

【问题讨论】:

    标签: java xml parsing antlr4 plaintext


    【解决方案1】:

    我熟悉解析器生成器,但不熟悉 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 令牌。

    【讨论】:

    • 感谢 kevin Anderson 的快速响应。它对我有用。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2011-12-23
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多