主机文件 ANTLR 语法

Mer*_*ham 3 grammar antlr hosts-file

网络上是否有现有的可用主机文件语法?

我在http://www.antlr.org/grammar/list上查看了列表,但我没有在那里找到它。

我还检查了 Wikipedia 中的 hosts 文件条目,它引用了RFC 952,但我认为这与 /windows/system32/drivers/etc/hosts 使用的格式不同。

任何语法格式都比没有好,但我更喜欢 ANTLR 格式的格式。这是我第一次使用任何语法生成器,我想保持较低的学习曲线。我已经计划使用 ANTLR 来使用其他文件。

Bar*_*ers 5

Microsoft页面:

HOSTS 文件格式与版本 4.3 Berkeley Software Distribution (BSD) UNIX /etc/hosts 文件中主机表的格式相同。

此处描述了 /etc/hosts 文件。

一个示例文件:

#
# Table of IP addresses and hostnames
#
172.16.12.2     peanut.nuts.com peanut
127.0.0.1       localhost
172.16.12.1     almond.nuts.com almond loghost
172.16.12.4     walnut.nuts.com walnut
172.16.12.3     pecan.nuts.com pecan
172.16.1.2      filbert.nuts.com filbert
172.16.6.4      salt.plant.nuts.com salt.plant salt
Run Code Online (Sandbox Code Playgroud)

主机文件的格式如下:

  • 每个表条目在/ etc /主机包含一个IP地址分离由空白(一个或多个)从一个主机名列表与该地址相关联的
  • 一个表条目可以任选地被零名或多个结束别名
  • 评论#

粗体字将是 ANTLR 语法中的规则,可能如下所示:

grammar Hosts;

parse
  :  tableEntry* EOF
  ;

tableEntry
  :  address hostName aliases?
     {
       System.out.println("\n== Entry ==");
       System.out.println("  address  : " + $address.text);
       System.out.println("  hostName : " + $hostName.text);
       System.out.println("  aliases  : " + $aliases.text);
     }
  ;

address
  :  Octet '.' Octet '.' Octet '.' Octet
  ;

hostName
  :  Name
  ;

aliases
  :  Name+
  ;

Name
  :  Letter+ ('.' Letter+)*
  ;

Comment
  :  '#' ~('\r' | '\n')* {$channel=HIDDEN;}
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}
  ;

Octet
  :  Digit Digit Digit
  |  Digit Digit
  |  Digit
  ;

fragment Letter
  :  'a'..'z'
  |  'A'..'Z'
  ;

fragment Digit
  :  '0'..'9'
  ;
Run Code Online (Sandbox Code Playgroud)

可以使用类进行测试:

#
# Table of IP addresses and hostnames
#
172.16.12.2     peanut.nuts.com peanut
127.0.0.1       localhost
172.16.12.1     almond.nuts.com almond loghost
172.16.12.4     walnut.nuts.com walnut
172.16.12.3     pecan.nuts.com pecan
172.16.1.2      filbert.nuts.com filbert
172.16.6.4      salt.plant.nuts.com salt.plant salt
Run Code Online (Sandbox Code Playgroud)

并将产生以下输出:

bart@hades:~/Programming/ANTLR/Demos/Hosts$ java -cp antlr-3.3.jar org.antlr.Tool Hosts.g
bart@hades:~/Programming/ANTLR/Demos/Hosts$ javac -cp antlr-3.3.jar *.java
bart@hades:~/Programming/ANTLR/Demos/Hosts$ java -cp .:antlr-3.3.jar Main

== Entry ==
  address  : 172.16.12.2
  hostName : peanut.nuts.com
  aliases  : peanut

== Entry ==
  address  : 127.0.0.1
  hostName : localhost
  aliases  : null

== Entry ==
  address  : 172.16.12.1
  hostName : almond.nuts.com
  aliases  : almond loghost

== Entry ==
      address  : 172.16.12.4
  hostName : walnut.nuts.com
  aliases  : walnut

== Entry ==
  address  : 172.16.12.3
  hostName : pecan.nuts.com
  aliases  : pecan

== Entry ==
  address  : 172.16.1.2
  hostName : filbert.nuts.com
  aliases  : filbert

== Entry ==
  address  : 172.16.6.4
  hostName : salt.plant.nuts.com
  aliases  : salt.plant salt
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个快速演示:主机名可以包含除我描述的字符之外的其他字符,仅举一个缺点。