主机文件ANTLR语法
web上是否存在可用的主机文件语法 我查了清单,但在那个里并没有找到 我也检查了,它引用了,但我认为这与/windows/system32/drivers/etc/hosts使用的格式不同 任何语法格式都比没有好,但我更喜欢ANTLR格式。这是我第一次使用任何语法生成器,我想保持我的学习曲线低。我已经计划使用ANTLR来使用其他文件。从一个页面: HOSTS文件格式与版本4.3 Berkeley Software Distribution(BSD)UNIX/etc/HOSTS文件中主机表的格式相同 并且描述了/etc/hosts文件 示例文件:主机文件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文件中主机表的格式相
#
# 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地址,由与该地址关联的主机名列表中的空格隔开
- 表项可以选择以零个或多个别名结尾
- 评论以
#
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,我修改了我的答案。这对我来说是一个很好的起点。谢谢:)当然,我会“让这成为我自己的”,如果我有更正,我会让你知道。