Грамматика Hosts file ANTLR

#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. Для меня это отличная отправная точка. Спасибо 🙂 Я, конечно, «сделаю это сам», и если у меня будут исправления, я дам вам знать.