Bison - parsing

Cel

Laboratorium ma na celu zapoznanie z generatorem parserów bison (bison manual). Zadanie polega na wykorzystaniu bisona do sprawdzenia poprawności specyfikacji serwerów wirtualnych Apache (Apache Virtual Host documentation).

bison - wprowadzenie

Informacje na temat bisona.

Serwery wirtualne - wprowadzenie

Jedną z popularnych możliwości udostępnianych przez serwer www są serwery wirtualne. Z wykorzystaniem mechanizmu serwerów wirtualnych można stworzyć np. pełny serwer www, identyfikowany własną nazwą domenową i imitujący osobną maszynę, ale znajdujący się na tym samym fizycznym serwerze jako inny serwis www. Więcej informacji - kurs Apache

Poniżej krótko opisane są konstrukcje, które powinny być obsługiwane w ramach opisywanego zadania.

Dyrektywy ServerName, Port, NameVirtualHost, DocumentRoot

Dyrektywa <VirtualHost>

Znaczniki <VirtualHost> i </VirtualHost> ograniczają grupę dyrektyw dotyczącą danego wirtualnego hosta.
<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
addr może być adresem IP lub nazwą domeny (używane są też nazwy zastępcze _default_ i *)

Przykład:

<VirtualHost 192.168.1.2:80 204.255.176.199:8080>
DocumentRoot /www/docs
ServerName host.foo.com
</VirtualHost>

Przyjmijmy, że wewnątrz znaczników <VirtualHost> i i </VirtualHost> pojawiają się dyrektywy:

Inny przykład:

    Port 80
    ServerName www.domain.tld
    DocumentRoot /www/domain
    
    NameVirtualHost 111.22.33.55

    <VirtualHost 111.22.33.55 111.22.33.66>
    DocumentRoot /www/otherdomain
    ServerName www.otherdomain.tld
    ServerAdmin admin@otherdomain.tld
    </VirtualHost>
   
    <VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.sub.domain.tld
    ServerAlias *.sub.domain.tld www.subdomain.tld
    </VirtualHost>
    

Zadanie

Parser dla wejścia

    # wirtualki
    Port 80
    ServerName server.domain.tld
    NameVirtualHost 111.22.33.44 

    <VirtualHost 111.22.33.44>
    DocumentRoot /www/domain
    ServerName www.domain.tld
    </VirtualHost>
    
    <VirtualHost 111.22.33.44>
    DocumentRoot /www/subdomain
    ServerName www.sub.domain.tld
    ServerAlias *.sub.domain.tld
    </VirtualHost> 

ma wypisywać na wyjściu dostępne dla klienta nazwy domenowe i aliasy serwerów wirtualnych, tj.

www.domain.tld
www.sub.domain.tld
*.sub.domain.tld

W przypadku niepoprawnych zapisów proszę wypisać komunikat o błędzie wraz z numerem linii i kontynuować przetwarzanie.

Przykładowy plik virtual.conf.

Materiały dodatkowe

Lex and YACC primer/HOWTO
"Yacc: Yet Another Compiler-Compiler", S.C. Johnson