#antlr #grammar #hosts-file
#antlr #грамматика #hosts-файл
Вопрос:
Существует ли существующая, работающая грамматика файла hosts в Интернете?
Я проверил список на http://www.antlr.org/grammar/list, но я этого там не нашел.
Я также проверил запись файла hosts в Википедии, и она ссылается на RFC 952, но я не думаю, что это тот же формат, который используется в / windows / system32 /drivers / etc / hosts.
Любой формат грамматики лучше, чем никакой, но я бы предпочел формат ANTLR. Это первый раз, когда я использую какие-либо генераторы грамматики, и я хочу, чтобы моя кривая обучения была низкой. Я уже планирую использовать ANTLR для использования других файлов.
Комментарии:
1. Или, если существует существующая простая альтернатива C # для использования и редактирования файла hosts, это также может быть полезно для меня 🙂
Ответ №1:
Со страницы Microsoft:
Формат файла HOSTS совпадает с форматом таблиц хостов в файле UNIX /etc/hosts версии 4.3 Berkeley Software Distribution (BSD).
А файл /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
Файл hosts выглядит отформатированным следующим образом:
- каждая запись таблицы в /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.*;
public class Main {
public static void main(String[] args) throws Exception {
String source =
"# n"
"# Table of IP addresses and Hostnames n"
"# n"
"172.16.12.2 peanut.nuts.com peanut n"
"127.0.0.1 localhost n"
"172.16.12.1 almond.nuts.com almond loghost n"
"172.16.12.4 walnut.nuts.com walnut n"
"172.16.12.3 pecan.nuts.com pecan n"
"172.16.1.2 filbert.nuts.com filbert n"
"172.16.6.4 salt.plant.nuts.com salt.plant salt ";
ANTLRStringStream in = new ANTLRStringStream(source);
HostsLexer lexer = new HostsLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
HostsParser parser = new HostsParser(tokens);
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
Обратите внимание, что это всего лишь краткая демонстрация: имена хостов могут содержать другие символы, чем те, которые я описал, чтобы назвать только один недостаток.
Комментарии:
1. Я согласен, что если бы у меня была грамматика, обладающая всеми функциями и совместимая, я должен был бы выполнить перевод в качестве упражнения. Я не могу сказать наверняка, но я не думаю, что эта грамматика совместима с файлом hosts Windows, который я пытаюсь использовать. Другое дело, я думаю, что у hosts есть некоторые менее используемые функции, но я ничего не могу найти в сети. Например, большинство страниц, которые я нашел с информацией, имеют только один IP-адрес и один псевдоним хоста, но я почти уверен, что для каждой записи поддерживается несколько псевдонимов…
2. @Merlyn, я пересмотрел свой ответ.
3. Для меня это отличная отправная точка. Спасибо 🙂 Я, конечно, «сделаю это сам», и если у меня будут исправления, я дам вам знать.