Хосты файл ANTLR грамматика - PullRequest
2 голосов
/ 26 мая 2011

Существует ли в сети действующая грамматика файла hosts?

Я проверил список на http://www.antlr.org/grammar/list,, но не нашел его там.

Я также проверил запись файла hosts в Википедии , и она ссылалась на RFC 952 , но я не думаю, что это тот же формат, который используется / windows / system32 / drivers /etc/hosts.

Любой формат грамматики лучше, чем никакой, но я бы предпочел один в формате ANTLR. Это первый раз, когда я использую генераторы грамматики, и я хочу, чтобы моя кривая обучения была низкой. Я уже планирую использовать ANTLR для использования других файлов.

1 Ответ

4 голосов
/ 26 мая 2011

со страницы 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

Файл хостов выглядит следующим образом:

  • каждая запись таблицы в / etc/ hosts содержит IP-адрес , разделенный пробелами из списка имен хостов , связанных с этим адресом
  • a таблицазапись может дополнительно заканчиваться нулем или более псевдоним
  • комментарии начинаются с #

Жирные слова будутправила в грамматике 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

Обратите внимание, что это всего лишь небольшая демонстрация: имена хостов могут содержать другие символы, отличные от описанных мной, чтобы назвать только один недостаток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...