Iptables 语法文件的 ANTLR4 语法问题

问题描述 投票:0回答:1

我正在尝试使用 ANTLR4 创建一个 iptables 解析器。

我编写了语法文件,有 5 个与解析器规则相关的错误无法解决。 运行此语法文件的输入是

antlr4 -Dlanguage=Cpp iptables.g4

错误如下所示:

error(50): iptables.g4::: syntax error: mismatched character ';' expecting '{'
error(50): iptables.g4:27:0: syntax error: unterminated rule (missing ';') detected at 'status_line :' while looking for rule element
error(50): iptables.g4::: syntax error: mismatched character ':' expecting '{'
error(50): iptables.g4:41:4: syntax error: mismatched input '|' expecting COLON while matching a lexer rule
error(50): iptables.g4:41:14: syntax error: '+' came as a complete surprise to me while matching rule preamble

我为解析器规则编写的语法文件:

grammar iptables;

//Parser rules
parse
    :   rule+ EOF
    ;

rule
    :   chain_rule
    |   policy_rule
    |   append_rule
    |   status_line
    ;

chain_rule
    :   'iptables' '-N' chain_name
    ;

policy_rule
    :   'iptables' '-P' chain_name policy
    ;

append_rule
    :   'iptables' '-A' chain_name options
    ;

status_line
    :   'Chain' chain_name '(' 'policy' policy PACKET_COUNT 'packets,' BYTE_COUNT 'bytes)'
    ;

chain_name
    :   'INPUT' | 'FORWARD' | 'OUTPUT' | CUSTOM_CHAIN
    ;

policy
    :   'ACCEPT' | 'DROP' | 'QUEUE' | 'RETURN'
    ;

options_
    :   DEFAULT
    |   option+
    ;

option
    :   '-s' LOCATION
    |   '-d' LOCATION
    |   '-p' PROTOCOL
    |   '--dport' PORT
    |   '--sport' PORT
    |   '-j' policy
    ;


//Lexer Rules 

fragment OCTET
    :   '0' 
    |   [1-9] [0-9]?
    |   '1' [0-9] [0-9]?
    |   '2' [0-4] [0-9]?
    |   '25' [0-5]
    ;

IP_ADDRESS
    :   OCTET '.' OCTET '.' OCTET '.' OCTET
    ;

PORT
    :   [0-9]+
    ;

PROTOCOL
    :   TCP
    |   UDP
    |   ICMP
    ;

TCP
    :   'tcp'
    ;

UDP
    :   'udp'
    ;

ICMP
    : 'icmp'
    ;

PACKET_COUNT
    :   [0-9]+
    ;

BYTE_COUNT
    :   [0-9]+
    ;

LOCATION
    :   IP_ADDRESS
    |   'anywhere'
    ;

DEFAULT
    :   '--'
    ;

CUSTOM_CHAIN
    :   [a-zA-Z_][a-zA-Z0-9_]*
    ;

WS
    :   [ \t\r\n]+ -> skip
    ;

antlr antlr4
1个回答
0
投票

options
是ANTLR中的保留字。变化:

options
    :   DEFAULT
    |   option+
    ;

至:

options_
    :   DEFAULT
    |   option+
    ;

(或

options
以外的其他东西)

© www.soinside.com 2019 - 2024. All rights reserved.