Bütünleşik Biçembentler, 2. Aşama
ÖncekiYukarıSonraki

D BB2 Dilbilgisi Kuralları

İçindekiler

    D.1 Dilbilgisi
    D.2 Sözdizimsel tarayıcı
    D.3 BB1 ile BB2 dizgeciklerinin karşılaştırması

Bu ek bölüm uyulması zorunlu bölümlerden biridir.

Aşağıdaki dilbilgisi kuralları BB2'nin sözdizimini tanımlar. Bazı bakımlardan, belirtimin kendisi bu dilbilgisi içinde ifade edilmemiş ek anlambilgisi içermektedir. Belirtime uyumlu bir kullanıcı arayüzünün ayrıca, Sözdizimi, BB nitelik tanımları ve birim gösterimlerine de uyması gerekir. Ek olarak, belge dili de kısıtlamalar getirebilir; örneğin HTML 'class' özniteliğinin olası değerleri üzerinde kısıtlamalara sahiptir.

D.1 Dilbilgisi

Aşağıdaki sözdizimi tanımları, çözümleme uzlaşımlarını ifade etmediğinden kullanıcı arayüzlerinin kullanması için değildir, sadece BB2 sözdizimini belirtir. Sözdizimi tanımları insanlar tarafından kullanılabilsin diye eniyilenmiş olup bazı kısa gösterimler için [YACC] gösterimleri kullanılmıştır:

Sözdizimi Tanımları
[1]   Biçembent   ::=   [ Charset_İmi B* Dizge B* ';' ]?
[ B | AçkBaşEtk | AçkBitEtk]* [ İçeren [ B | AçkBaşEtk | AçkBitEtk]* ]*
[ [ KuralKümesi | Ortam | YazıcıOrtamı | Yazıtipi ] [ B | AçkBaşEtk | AçkBitEtk ]* ]*
[2]   İçeren   ::=   Import_İmi B* [ Dizge | TanımYeri ] B* [ OrtamAdı [ ',' B* OrtamAdı ]* ]? ';' B*
[3]   Ortam   ::=   Media_İmi B* OrtamAdı [ ',' B* OrtamAdı ]* '{' B* KuralKümesi* '}' B*
[4]   OrtamAdı   ::=   Betimleyici B*
[5]   YazıcıOrtamı   ::=   Page_İmi B* Betimleyici? SözdeSayfa? B* '{' B* Bildirim [ ';' B* Bildirim ]* '}' B*
[6]   SözdeSayfa   ::=   ':' Betimleyici
[7]   Yazıtipi   ::=   FontFace_İmi B* '{' B* Bildirim [ ';' B* Bildirim ]* '}' B*
[8]   İşleç   ::=   '/' B* | ',' B* | /* empty */
[9]   Birleştirici   ::=   '+' B* | '>' B* | /* empty */
[10]   TekTerimli   ::=   '-' | '+'
[11]   Nitelik   ::=   Betimleyici B*
[12]   KuralKümesi   ::=   Seçici [ ',' B* Seçici ]* Blok B*
[13]   Blok   ::=   '{' B* Bildirim [ ';' B* Bildirim ]* '}'
[14]   Seçici   ::=   BasitSeçici [ Birleştirici BasitSeçici ]*
[15]   BasitSeçici   ::=   ElemanAdı? [ Diyez | Sınıf | Öznitelik | SözdeBirŞey ]* B*
[16]   Sınıf   ::=   '.' Betimleyici
[17]   ElemanAdı   ::=   Betimleyici | '*'
[18]   Öznitelik   ::=   '[' B* Betimleyici B* [ [ '=' | BoşlukluEşlem | TireliEşlem ] B*
[ Betimleyici | Dizge ] B* ]? ']'
[19]   SözdeBirŞey   ::=   ':' [ Betimleyici | İşlevBaşı B* Betimleyici B* ')' ]
[20]   Bildirim   ::=   Nitelik ':' B* İfade Önem? | /* empty */
[21]   Önem   ::=   Önemli_İmi B*
[22]   İfade   ::=   Terim [ İşleç Terim ]*
[23]   Terim   ::=   TekTerimli?
[ Sayı B* | YüzdeDeğeri B* | Uzunluk B* | EmUzunluk B* | EksUzunluk B* | Açı B* | Süre B* | Frekans B* | İşlev ] | Dizge B* | Betimleyici B* | TanımYeri B* | UnicodeAralığı B* | Renk
[24]   İşlev   ::=   İşlevBaşı B* İfade ')' B*
[25]   Renk   ::=   Diyez B*

Renk değerleri üzerinde bir kısıtlama vardır: bir '#' karakterinden hemen sonra gelen ya 3 ya da 6 adet onaltılık rakamdan (yani, [0-9a-fA-F]) oluşmaları gerekir; örneğin, "#000" geçerlidir ama "#abcd" geçerli değildir.

Çevirmenin notu:
Yukarıdaki sözdizimi tanımlarını alt tanım terimleriyle bir bütün haline getirebilmek ve biçembent yazanların yazım kurallarına çabuk ulaşabilmesini sağlamak için aşağıdaki sözdizimi tanımlarını (Lex sözdizimsel tarayıcı sonuçlarından kodları tercüme ederek) ben ekledim.
Dizgecik Tanımları
[26]   Onaltı   ::=   [0-9a-f]
[27]   AsciiDışı   ::=   [\80-\10ffff]
[28]   Unicode   ::=   '\' Onaltı{1,6}[ \t\r\n\f]?
[29]   Öncelem   ::=   Unicode | '\' [ -~\80-\10ffff]
[30]   AdBaşl   ::=   [_a-z] | AsciiDışı | Öncelem
[31]   AdKark   ::=   [_a-z0-9-] | AsciiDışı | Öncelem
[32]   Dizge1   ::=   '"' ([\t !#$%&(-~] | SatırSonu | "'" | AsciiDışı | Öncelem)* '"'
[33]   Dizge2   ::=   "'" ([\t !#$%&(-~] | SatırSonu | '"' | AsciiDışı | Öncelem)* "'"
[34]   Betimleyici   ::=   AdBaşl AdKark*
[35]   Ad   ::=   AdKark+
[36]   Sayı   ::=   [0-9]+ | [0-9]* '.' [0-9]+
[37]   Dizge   ::=   Dizge1 | Dizge2
[38]   URL   ::=   ([!#$%&*-~] | AsciiDışı | Öncelem)*
[39]   KBoş   ::=   [ \t\r\n\f]*
[40]   SatırSonu   ::=   \n | \r\n | \r | \f
[41]   Aralık   ::=   '?'{1,6} | Onaltı ('?'{0,5} | Onaltı ('?'{0,4} | Onaltı ('?'{0,3} | Onaltı ('?'{0,2} | Onaltı ('??' | Onaltı)))))
[42]   B   ::=   [ \t\r\n\f]+
[43]   Açıklama   ::=   \/\*[^*]*\*+([^/][^*]*\*+)*\//* ignore comments */
[44]   AçkBaşEtk   ::=   '<!--'
[45]   AçkBitEtk   ::=   '-->'
[46]   BoşlukluEşlem   ::=   '~='
[47]   TireliEşlem   ::=   '|='
[48]   Diyez   ::=   '#' Ad
[49]   Import_İmi   ::=   '@import'
[50]   Page_İmi   ::=   '@page'
[51]   Media_İmi   ::=   '@media'
[52]   FontFace_İmi   ::=   '@font-face'
[53]   Charset_İmi   ::=   '@charset'
[54]   Önemli_İmi   ::=   '!' KBoş 'important'
[55]   EmUzunluk   ::=   Sayı 'em'
[56]   EksUzunluk   ::=   Sayı 'ex'
[57]   Uzunluk   ::=   Sayı 'px' |
Sayı 'cm' |
Sayı 'mm' |
Sayı 'in' |
Sayı 'pt' |
Sayı 'pc'
[58]   Açı   ::=   Sayı 'deg' |
Sayı 'rad' |
Sayı 'grad'
[59]   Süre   ::=   Sayı 'ms' |
Sayı 's'
[60]   Frekans   ::=   Sayı 'Hz' |
Sayı 'kHz'
[61]   Boyut   ::=   Sayı Betimleyici
[62]   YüzdeDeğeri   ::=   Sayı '%'
[63]   TanımYeri   ::=   'url(' KBoş Dizge KBoş ')' |
'url(' KBoş URL KBoş ')'
[64]   İşlevBaşı   ::=   Betimleyici '('
[65]   UnicodeAralığı   ::=   'U+' Aralık | 'U+' Onaltı{1,6} - Onaltı{1,6}

D.2 Sözdizimsel tarayıcı

Aşağıdaki dizgecikler [FLEX] gösterimiyle yazılmıştır ve harf büyüklüğüne duyarlı değillerdir.

Aşağıda yer alan her iki "\377" değeri de Flex'in çalışabildiği en büyük karakter numarasını (onluk tabanda 255) göstermektedir. Bunlar Unicode/ISO-10646'da en büyük karakter kodu olan ve BB2'de geçerli bir karakter öncelemi olarak "\10FFFF" şeklinde okunmalıdır.

%option case-insensitive

h               [0-9a-f]
nonascii        [\200-\377]
unicode         \\{h}{1,6}[ \t\r\n\f]?
escape          {unicode}|\\[ -~\200-\377]
nmstart         [a-z]|{nonascii}|{escape}
nmchar          [a-z0-9-]|{nonascii}|{escape}
string1         \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"
string2         \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'

ident           {nmstart}{nmchar}*
name            {nmchar}+
num             [0-9]+|[0-9]*"."[0-9]+
string          {string1}|{string2}
url             ([!#$%&*-~]|{nonascii}|{escape})*
w               [ \t\r\n\f]*
nl              \n|\r\n|\r|\f
range           \?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h})))))

%%

[ \t\r\n\f]+            {return S;}

\/\*[^*]*\*+([^/][^*]*\*+)*\/   /* ignore comments */

"<!--"                  {return CDO;}
"-->"                   {return CDC;}
"~="                    {return INCLUDES;}
"|="                    {return DASHMATCH;}

{string}                {return STRING;}

{ident}                 {return IDENT;}

"#"{name}               {return HASH;}

"@import"               {return IMPORT_SYM;}
"@page"                 {return PAGE_SYM;}
"@media"                {return MEDIA_SYM;}
"@font-face"            {return FONT_FACE_SYM;}
"@charset"              {return CHARSET_SYM;}
"@"{ident}              {return ATKEYWORD;}

"!{w}important"         {return IMPORTANT_SYM;}

{num}em                 {return EMS;}
{num}ex                 {return EXS;}
{num}px                 {return LENGTH;}
{num}cm                 {return LENGTH;}
{num}mm                 {return LENGTH;}
{num}in                 {return LENGTH;}
{num}pt                 {return LENGTH;}
{num}pc                 {return LENGTH;}
{num}deg                {return ANGLE;}
{num}rad                {return ANGLE;}
{num}grad               {return ANGLE;}
{num}ms                 {return TIME;}
{num}s                  {return TIME;}
{num}Hz                 {return FREQ;}
{num}kHz                {return FREQ;}
{num}{ident}            {return DIMEN;}
{num}%                  {return PERCENTAGE;}
{num}                   {return NUMBER;}

"url("{w}{string}{w}")" {return URI;}
"url("{w}{url}{w}")"    {return URI;}
{ident}"("              {return FUNCTION;}

U\+{range}              {return UNICODERANGE;}
U\+{h}{1,6}-{h}{1,6}    {return UNICODERANGE;}

.                       {return *yytext;}

D.3 BB1 ile BB2 dizgeciklerinin karşılaştırması

BB1 önergesinde ([CSS1]) belirtilen sözdizimi yukarıdakinden biraz farklıdır. Çoğu BB2'deki bazı dizgeciklerin BB1'de bulunmayışındandır. Diğerleri dilbilgisinin daha okunabilir olması için yeniden yazılmasından kaynaklanmıştır. Bununla birlikte, BB1 ile uyumlu olmayan ve BB1'de hatalara yol açabilecek bazı değişiklikler de vardır. Bunlara burada değinilmiştir.

ÖncekiYukarıSonraki
Implementation and performance notes for fontsBir Linux Kitaplığı SayfasıReferences