主机文件ANTLR语法

主机文件ANTLR语法,antlr,grammar,hosts-file,Antlr,Grammar,Hosts File,web上是否存在可用的主机文件语法 我查了清单,但在那个里并没有找到 我也检查了,它引用了,但我认为这与/windows/system32/drivers/etc/hosts使用的格式不同 任何语法格式都比没有好,但我更喜欢ANTLR格式。这是我第一次使用任何语法生成器,我想保持我的学习曲线低。我已经计划使用ANTLR来使用其他文件。从一个页面: HOSTS文件格式与版本4.3 Berkeley Software Distribution(BSD)UNIX/etc/HOSTS文件中主机表的格式相

web上是否存在可用的主机文件语法

我查了清单,但在那个里并没有找到

我也检查了,它引用了,但我认为这与/windows/system32/drivers/etc/hosts使用的格式不同

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

从一个页面:

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
主机文件的格式如下所示:

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'
  ;
  • /etc/hosts中的每个表项都包含一个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'
  ;
可通过以下类别进行测试:

import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串源=
“#\n”+
“#IP地址和主机名表\n”+
“#\n”+
“172.16.12.2 peant.nuts.com花生\n”+
“127.0.0.1本地主机\n”+
“172.16.12.1 ammond.nuts.com ammond日志主机\n”+
“172.16.12.4 walnut.nuts.com walnut\n”+
“172.16.12.3 pecan.nuts.com山核桃\n”+
“172.16.1.2 filbert.nuts.com filbert\n”+
“172.16.6.4 salt.plant.nuts.com salt.plant salt”;
AntlStringStream in=新的AntlStringStream(源);
HostsLexer lexer=新的HostsLexer(in);
CommonTokenStream令牌=新的CommonTokenStream(lexer);
HostsParser解析器=新的HostsParser(令牌);
parser.parse();
}
}
并将产生以下输出:

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

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

或者,如果有一个现有的、简单的、轻量级的C#替代方案来使用和编辑主机文件,这可能对我也很有用:)我同意,如果我有一个语法具有所有的功能并且兼容,那么我应该将翻译作为一个练习。我不能确定,但我认为这种语法与Windows的hosts文件不兼容,这正是我试图使用的。另一件事是,我认为主机有一些较少使用的功能,但我在网上找不到任何东西。例如,我发现的大多数带有信息的页面只有一个IP地址和一个主机别名,但我很确定每个条目都支持多个别名…@Merlyn,我修改了我的答案。这对我来说是一个很好的起点。谢谢:)当然,我会“让这成为我自己的”,如果我有更正,我会让你知道。