Gramatyka HTML 3.2 - BNF

    Poniżej jest przedstawiona gramatyka HTML 3.2  w notacji BNF, oraz przy użyciu wyrażeń regularnych. W dokumetach zgodnych z tą gramatyka wymagane jest aby znacznik <P> kończył się </P>, co nie jest wymagane w standardzie języka.

    Znaczenie użytych symboli:
%expression<nazwa> -  oznacza stan. Wyrażenia napisane poniżej to wyrażenia dostępne w danym stanie,
%push <nazwa>       - przejście z obecnego stanu do stanu <nazwa>,
%pop                - przejście do stanu, z którego obecny stan został osiągnięty,
%ignore             - symbol  jest ignorowany, nie podlega przetwarzaniu w gramatyce.

Makra zastosowane w wyrażeniach regularnych:

{FNMCHAR}   '[a-zA-Z]'
{NMCHAR}    '[a-zA-Z0-9\.\-]'
{DIGIT}     '[0-9]'
{HEXDIGIT}  '[a-fA-F0-9]'
{ps}        '[ \t\r\n\f\l]'

Symbole terminalne (leksemy):

%expression Main
'[^<&]+'  'DATA';
'<!\-\-'  %ignore, %push Coment;
'<![dD][oO][cC][tT][yY][pP][eE] [hH][tT][mM][lL] [pP][uU][bB][lL][iI][cC].*>' DOCTYPE';
'&{FNMCHAR}{NMCHAR}*'  'DATA';
'&#{NMCHAR}+'     'DATA' ;
'{ps}+'  %ignore;

'<[aA]'     '<A',%push Attr;
'<[bB]'     '<B',%push Attr;
'<[iI]'     '<I',%push Attr;
'<[pP]'     '<P',%push Attr;
'<[uU]'     '<U',%push Attr;
'<[bB][rR]'    '<BR',%push Attr;
'<[dD][dD]'    '<DD',%push Attr;
'<[dD][lL]'    '<DL',%push Attr;
'<[dD][tT]'    '<DT',%push Attr;
'<[eE][mM]'    '<EM',%push Attr;
'<[hH]1'   '<H1',%push Attr;
'<[hH]2'    '<H2',%push Attr;
'<[hH]3'    '<H3',%push Attr;
'<[hH]4'    '<H4',%push Attr;
'<[hH]5'    '<H5',%push Attr;
'<[hH]6'    '<H6',%push Attr;
'<[hH][rR]'    '<HR',%push Attr;
'<[lL][iI]'    '<LI',%push Attr;
'<[oO][lL]'    '<OL',%push Attr;
'<[tT][dD]'    '<TD',%push Attr;
'<[tT][hH]'    '<TH',%push Attr;
'<[tT][rR]'    '<TR',%push Attr;
'<[tT][tT]'    '<TT',%push Attr;
'<[uU][lL]'    '<UL',%push Attr;
'<[bB][iI][gG]'    '<BIG',%push Attr;
'<[dD][fF][nN]'    '<DFN',%push Attr;
'<[dD][iI][rR]'    '<DIR',%push Attr;
'<[dD][iI][vV]'    '<DIV',%push Attr;
'<[iI][mM][gG]'    '<IMG',%push Attr;
'<[kK][bB][dD]'    '<KBD',%push Attr;
'<[mM][aA][pP]'    '<MAP',%push Attr;
'<[pP][rR][eE]'    '<PRE',%push Attr;
'<[sS][uU][bB]'    '<SUB',%push Attr;
'<[sS][uU][pP]'    '<SUP',%push Attr;
'<[vV][aA][rR]'    '<VAR',%push Attr;
'<[aA][rR][eE][aA]'    '<AREA',%push Attr;
'<[bB][aA][sS][eE]'    '<BASE',%push Attr;
'<[bB][oO][dD][yY]'    '<BODY',%push Attr;
'<[cC][iI][tT][eE]'    '<CITE',%push Attr;
'<[cC][oO][dD][eE]'    '<CODE',%push Attr;
'<[fF][oO][nN][tT]'    '<FONT',%push Attr;
'<[fF][oO][rR][mM]'    '<FORM',%push Attr;
'<[hH][eE][aA][dD]'    '<HEAD',%push Attr;
'<[hH][tT][mM][lL]'    '<HTML',%push Attr;
'<[lL][iI][nN][kK]'    '<LINK',%push Attr;
'<[mM][eE][nN][uU]'    '<MENU',%push Attr;
'<[mM][eE][tT][aA]'    '<META',%push Attr;
'<[sS][aA][mM][pP]'    '<SAMP',%push Attr;
'<[iI][nN][pP][uU][tT]'   '<INPUT',%push Attr;
'<[pP][aA][rR][aA][mM]'   '<PARAM',%push Attr;
'<[sS][mM][aA][lL][lL]'   '<SMALL',%push Attr;
'<[sS][tT][yY][lL][eE]'   '<STYLE',%push Attr;
'<[tT][aA][bB][lL][eE]'   '<TABLE',%push Attr;
'<[tT][iI][tT][lL][eE]'   '<TITLE',%push Attr;
'<[aA][pP][pP][lL][eE][tT]'   '<APPLET',%push Attr;
'<[cC][eE][nN][tT][eE][rR]'   '<CENTER',%push Attr;
'<[oO][pP][tT][iI][oO][nN]'   '<OPTION',%push Attr;
'<[sS][cC][rR][iI][pP][tT]'  '<SCRIPT',%push Attr;
'<[sS][eE][lL][eE][cC][tT]'   '<SELECT',%push Attr;
'<[sS][tT][rR][iI][kK][eE]'  '<STRIKE',%push Attr;
'<[sS][tT][rR][oO][nN][gG]'   '<STRONG',%push Attr;
'<[aA][dD][dD][rR][eE][sS][sS]'  '<ADDRESS',%push Attr;
'<[cC][aA][pP][tT][iI][oO][nN]'  '<CAPTION',%push Attr;
'<[bB][aA][sS][eE][fF][oO][nN][tT]'  '<BASEFONT',%push Attr;
'<[iI][sS][iI][nN][dD][eE][xX]'   '<ISINDEX',%push Attr;
'<[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE]'  '<BLOCKQUOTE',%push Attr;
'<[tT][eE][xX][tT][aA][rR][eE][aA]'  '<TEXTAREA',%push Attr;
'{ps}+'  %ignore;

'</[aA]'     '</A', %push End;
'</[bB]'     '</B', %push End;
'</[iI]'     '</I', %push End;
'</[pP]'     '</P', %push End;
'</[uU]'     '</U', %push End;
'</[bB][rR]'    '</BR', %push End;
'</[dD][dD]'    '</DD', %push End;
'</[dD][lL]'    '</DL', %push End;
'</[dD][tT]'    '</DT', %push End;
'</[eE][mM]'    '</EM', %push End;
'</[hH]1'    '</H1', %push End;
'</[hH]2'    '</H2', %push End;
'</[hH]3'    '</H3', %push End;
'</[hH]4'    '</H4', %push End;
'</[hH]5'    '</H5', %push End;
'</[hH]6'    '</H6', %push End;
'</[hH][rR]'    '</HR', %push End;
'</[lL][iI]'    '</LI', %push End;
'</[oO][lL]'    '</OL', %push End;
'</[tT][dD]'    '</TD', %push End;
'</[tT][hH]'    '</TH', %push End;
'</[tT][rR]'    '</TR', %push End;
'</[tT][tT]'    '</TT', %push End;
'</[uU][lL]'    '</UL', %push End;
'</[bB][iI][gG]'    '</BIG', %push End;
'</[dD][fF][nN]'    '</DFN', %push End;
'</[dD][iI][rR]'    '</DIR', %push End;
'</[dD][iI][vV]'    '</DIV', %push End;
'</[iI][mM][gG]'    '</IMG', %push End;
'</[kK][bB][dD]'    '</KBD', %push End;
'</[mM][aA][pP]'    '</MAP', %push End;
'</[pP][rR][eE]'    '</PRE', %push End;
'</[sS][uU][bB]'    '</SUB', %push End;
'</[sS][uU][pP]'    '</SUP', %push End;
'</[vV][aA][rR]'    '</VAR', %push End;
'</[aA][rR][eE][aA]'    '</AREA', %push End;
'</[bB][aA][sS][eE]'    '</BASE', %push End;
'</[bB][oO][dD][yY]'    '</BODY', %push End;
'</[cC][iI][tT][eE]'    '</CITE', %push End;
'</[cC][oO][dD][eE]'    '</CODE', %push End;
'</[fF][oO][nN][tT]'    '</FONT', %push End;
'</[fF][oO][rR][mM]'    '</FORM', %push End;
'</[hH][eE][aA][dD]'    '</HEAD', %push End;
'</[hH][tT][mM][lL]'    '</HTML', %push End;
'</[lL][iI][nN][kK]'    '</LINK', %push End;
'</[mM][eE][nN][uU]'    '</MENU', %push End;
'</[mM][eE][tT][aA]'    '</META', %push End;
'</[sS][aA][mM][pP]'    '</SAMP', %push End;
'</[iI][nN][pP][uU][tT]'   '</INPUT', %push End;
'</[pP][aA][rR][aA][mM]'   '</PARAM', %push End;
'</[sS][mM][aA][lL][lL]'   '</SMALL', %push End;
'</[sS][tT][yY][lL][eE]'   '</STYLE', %push End;
'</[tT][aA][bB][lL][eE]'   '</TABLE', %push End;
'</[tT][iI][tT][lL][eE]'   '</TITLE', %push End;
'</[aA][pP][pP][lL][eE][tT]'   '</APPLET', %push End;
'</[cC][eE][nN][tT][eE][rR]'   '</CENTER', %push End;
'</[oO][pP][tT][iI][oO][nN]'   '</OPTION', %push End;
'</[sS][cC][rR][iI][pP][tT]'   '</SCRIPT', %push End;
'</[sS][eE][lL][eE][cC][tT]'   '</SELECT', %push End;
'</[sS][tT][rR][iI][kK][eE]'   '</STRIKE', %push End;
'</[sS][tT][rR][oO][nN][gG]'   '</STRONG', %push End;
'</[aA][dD][dD][rR][eE][sS][sS]'  '</ADDRESS', %push End;
'</[cC][aA][pP][tT][iI][oO][nN]'  '</CAPTION', %push End;
'</[bB][aA][sS][eE][fF][oO][nN][tT]'  '</BASEFONT', %push End;
'</[iI][sS][iI][nN][dD][eE][xX]'   '</ISINDEX', %push End;
'</[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE]'  '</BLOCKQUOTE', %push End;
'</[tT][eE][xX][tT][aA][rR][eE][aA]'  '</TEXTAREA', %push End;

%expression End
'{ps}+'  %ignore;
'>'   '>', %pop;

%expression Coment
'.' %ignore ;
'\n' %ignore ;
'\-\->' %ignore, %pop ;

%expression Attr
'{ps}+'  %ignore;
'='   '=', %push Val;
'>'   '>', %pop;
'[aA][lL][tT]'    'ALT';
'[aA][cC][tT][iI][oO][nN]'   'ACTION';
'[aA][lL][iI][gG][nN]'   'ALIGN';
'[aA][lL][iI][nN][kK]'   'ALINK';
'[bB][oO][rR][dD][eE][rR]'   'BORDER';
'[bB][gG][cC][oO][lL][oO][rR]'  'BGCOLOR';
'[bB][aA][cC][kK][gG][rR][oO][uU][nN][dD]' 'BACKGROUND';
'[cC][oO][dD][eE]'   'CODE';
'[cC][oO][lL][sS]'   'COLS';
'[cC][oO][lL][oO][rR]'   'COLOR';
'[cC][lL][eE][aA][rR]'   'CLEAR';
'[cC][oO][oO][rR][dD][sS]'   'COORDS';
'[cC][hH][eE][cC][kK][eE][dD]'  'CHECKED';
'[cC][oO][lL][sS][pP][aA][nN]'  'COLSPAN';
'[cC][oO][mM][pP][aA][cC][tT]'  'COMPACT';
'[cC][oO][nN][tT][eE][nN][tT]'  'CONTENT';
'[cC][oO][dD][eE][bB][aA][sS][eE]'  'CODEBASE';
'[cC][eE][lL][lL][pP][aA][dD][dD][iI][nN][gG]' 'CELLPADDING';
'[cC][eE][lL][lL][sS][pP][aA][cC][iI][nN][gG]' 'CELLSPACING';
'[eE][nN][cC][tT][yY][pP][eE]'  'ENCTYPE';
'[hH][rR][eE][fF]'   'HREF';
'[hH][eE][iI][gG][hH][tT]'   'HEIGHT';
'[hH][sS][pP][aA][cC][eE]'   'HSPACE';
'[hH][tT][tT][pP]\-[eE][qQ][uU][iI][vV]' 'HTTP-EQUIV';
'[iI][sS][mM][aA][pP]'   'ISMAP';
'[lL][iI][nN][kK]'   'LINK';
'[mM][eE][tT][hH][oO][dD]'   'METHOD';
'[mM][uU][lL][tT][iI][pP][lL][eE]'  'MULTIPLE';
'[mM][aA][xX][lL][eE][nN][gG][tT][hH]'  'MAXLENGTH';
'[nN][aA][mM][eE]'   'NAME';
'[nN][oO][wW][rR][aA][pP]'   'NOWRAP';
'[nN][oO][hH][rR][eE][fF]'   'NOHREF';
'[nN][oO][sS][hH][aA][dD][eE]'  'NOSHADE';
'[pP][rR][oO][mM][pP][tT]'   'PROMPT';
'[rR][eE][fF]'    'REF';
'[rR][eE][lL]'    'REL';
'[rR][eE][vV]'    'REV';
'[rR][oO][wW][sS]'   'ROWS';
'[rR][oO][wW][sS][pP][aA][nN]'  'ROWSPAN';
'[sS][rR][cC]'    'SRC';
'[sS][iI][zZ][eE]'   'SIZE';
'[sS][hH][aA][pP][eE]'   'SHAPE';
'[sS][tT][aA][rR][tT]'   'START';
'[sS][eE][lL][eE][cC][tT][eE][dD]'  'SELECTED';
'[tT][eE][xX][tT]'   'TEXT';
'[tT][yY][pP][eE]'   'TYPE';
'[tT][iI][tT][lL][eE]'   'TITLE';
'[uU][sS][eE][mM][aA][pP]'   'USEMAP';
'[vV][aA][lL][uU][eE]'   'VALUE';
'[vV][lL][iI][nN][kK]'   'VLINK';
'[vV][sS][pP][aA][cC][eE]'   'VSPACE';
'[vV][aA][lL][iI][gG][nN]'   'VALIGN';
'[vV][eE][rR][sS][iI][oO][nN]'  'VERSION';
'[wW][iI][dD][tT][hH]'   'WIDTH';

%expression Val
'\"[^\"]*\"'     'STRING' %pop;
'{DIGIT}+'  'NUMBER', %pop;
'{NMCHAR}+'  'STRING', %pop;
'\"#{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}\"' 'RGB', %pop;
'\"[\+\-]{DIGIT}+\"' 'SIZE_VALUE', %pop;
'\"{DIGIT}+\"' 'NUMBER', %pop;
'\"{DIGIT}+%\"'  'PERCENT', %pop;
'[aA][lL][lL]'   'ALL', %pop;
'[aA][qQ][uU][aA]'  'AQUA', %pop;
'[bB][aA][sS][eE][lL][iI][nN][eE]' 'BASELINE', %pop;
'[bB][lL][uU][eE]'  'BLUE', %pop;
'[bB][lL][aA][cC][kK]'  'BLACK', %pop;
'[bB][oO][tT][tT][oO][mM]'  'BOTTOM', %pop;
'[cC][eE][nN][tT][eE][rR]'  'CENTER', %pop;
'[cC][iI][rR][cC][lL][eE]'  'CIRCLE', %pop;
'[cC][oO][mM][pP][aA][cC][tT]' 'COMPACT', %pop;
'[cC][hH][eE][cC][kK][bB][oO][xX]' 'CHECKBOX', %pop;
'[cC][hH][eE][cC][kK][eE][dD]' 'CHECKED', %pop;
'[dD][iI][sS][cC]'  'DISC', %pop;
'[dD][eE][fF][aA][uU][lL][tT]' 'DEFAULT', %pop;
'[fF][iI][lL][eE]'  'FILE', %pop;
'[fF][uU][cC][hH][sS][iI][aA]' 'FUCHSIA', %pop;
'[gG][eE][tT]'   'GET', %pop;
'[gG][rR][aA][yY]'  'GRAY', %pop;
'[gG][rR][eE][eE][nN]'  'GREEN', %pop;
'[hH][iI][dD][dD][eE][nN]'  'HIDDEN', %pop;
'[iI][mM][aA][gG][eE]'  'IMAGE', %pop;
'[iI][sS][mM][aA][pP]'  'ISMAP', %pop;
'[lL][eE][fF][tT]'  'LEFT', %pop;
'[lL][iI][mM][eE]'  'LIME', %pop;
'[mM][aA][rR][oO][oO][nN]'  'MAROON', %pop;
'[mM][iI][dD][dD][lL][eE]'  'MIDDLE', %pop;
'[mM][uU][lL][tT][iI][pP][lL][eE]' 'MULTIPLE', %pop;
'[nN][aA][vV][yY]'  'NAVY', %pop;
'[nN][oO][nN][eE]'  'NONE', %pop;
'[nN][oO][wW][rR][aA][pP]'  'NOWRAP', %pop;
'[nN][oO][hH][rR][eE][fF]'  'NOHREF', %pop;
'[nN][oO][sS][hH][aA][dD][eE]' 'NOSHADE', %pop;
'[oO][lL][iI][vV][eE]'  'OLIVE', %pop;
'[pP][oO][lL][yY]'  'POLY', %pop;
'[pP][oO][sS][tT]'  'POST', %pop;
'[pP][uU][rR][pP][lL][eE]'  'PURPLE', %pop;
'[pP][aA][sS][sS][wW][oO][rR][dD]' 'PASSWORD', %pop;
'[rR][eE][dD]'   'RED', %pop;
'[rR][eE][cC][tT]'  'RECT', %pop;
'[rR][aA][dD][iI][oO]'  'RADIO', %pop;
'[rR][eE][sS][eE][tT]'  'RESET', %pop;
'[rR][iI][gG][hH][tT]'  'RIGHT', %pop;
'[sS][lL][iI][vV][eE][rR]'  'SLIVER', %pop;
'[sS][qQ][uU][aA][rR][eE]'  'SQUARE', %pop;
'[sS][uU][bB][mM][iI][tT]'  'SUBMIT', %pop;
'[sS][eE][lL][eE][cC][tT][eE][dD]' 'SELECTED', %pop;
'[tT][oO][pP]'   'TOP', %pop;
'[tT][eE][aA][lL]'  'TEAL', %pop;
'[tT][eE][xX][tT]'  'TEXT', %pop;
'[wW][hH][iI][tT][eE]'  'WHITE', %pop;
'[yY][eE][lL][lL][oO][wW]'  'YELLOW', %pop;

Wartości w cudzysłowach:

'\"[aA][lL][lL]\"'   'ALL', %pop;
'\"[aA][qQ][uU][aA]\"'  'AQUA', %pop;
'\"[bB][aA][sS][eE][lL][iI][nN][eE]\"' 'BASELINE', %pop;
'\"[bB][lL][uU][eE]\"'  'BLUE', %pop;
'\"[bB][lL][aA][cC][kK]\"'  'BLACK', %pop;
'\"[bB][oO][tT][tT][oO][mM]\"'  'BOTTOM', %pop;
'\"[cC][eE][nN][tT][eE][rR]\"'  'CENTER', %pop;
'\"[cC][iI][rR][cC][lL][eE]\"'  'CIRCLE', %pop;
'\"[cC][oO][mM][pP][aA][cC][tT]\"' 'COMPACT', %pop;
'\"[cC][hH][eE][cC][kK][bB][oO][xX]\"' 'CHECKBOX', %pop;
'\"[cC][hH][eE][cC][kK][eE][dD]\"' 'CHECKED', %pop;
'\"[dD][iI][sS][cC]\"'  'DISC', %pop;
'\"[dD][eE][fF][aA][uU][lL][tT]\"' 'DEFAULT', %pop;
'\"[fF][iI][lL][eE]\"'  'FILE', %pop;
'\"[fF][uU][cC][hH][sS][iI][aA]\"' 'FUCHSIA', %pop;
'\"[gG][eE][tT]\"'   'GET', %pop;
'\"[gG][rR][aA][yY]\"'  'GRAY', %pop;
'\"[gG][rR][eE][eE][nN]\"'  'GREEN', %pop;
'\"[hH][iI][dD][dD][eE][nN]\"'  'HIDDEN', %pop;
'\"[iI][mM][aA][gG][eE]\"'  'IMAGE', %pop;
'\"[iI][sS][mM][aA][pP]\"'  'ISMAP', %pop;
'\"[lL][eE][fF][tT]\"'  'LEFT', %pop;
'\"[lL][iI][mM][eE]\"'  'LIME', %pop;
'\"[mM][aA][rR][oO][oO][nN]\"'  'MAROON', %pop;
'\"[mM][iI][dD][dD][lL][eE]\"'  'MIDDLE', %pop;
'\"[mM][uU][lL][tT][iI][pP][lL][eE]\"' 'MULTIPLE', %pop;
'\"[nN][aA][vV][yY]\"'  'NAVY', %pop;
'\"[nN][oO][nN][eE]\"'  'NONE', %pop;
'\"[nN][oO][wW][rR][aA][pP]\"'  'NOWRAP', %pop;
'\"[nN][oO][hH][rR][eE][fF]\"'  'NOHREF', %pop;
'\"[nN][oO][sS][hH][aA][dD][eE]\"' 'NOSHADE', %pop;
'\"[oO][lL][iI][vV][eE]\"'  'OLIVE', %pop;
'\"[pP][oO][lL][yY]\"'  'POLY', %pop;
'\"[pP][oO][sS][tT]\"'  'POST', %pop;
'\"[pP][uU][rR][pP][lL][eE]\"'  'PURPLE', %pop;
'\"[pP][aA][sS][sS][wW][oO][rR][dD]\"' 'PASSWORD', %pop;
'\"[rR][eE][dD]\"'   'RED', %pop;
'\"[rR][eE][cC][tT]\"'  'RECT', %pop;
'\"[rR][aA][dD][iI][oO]\"'  'RADIO', %pop;
'\"[rR][eE][sS][eE][tT]\"'  'RESET', %pop;
'\"[rR][iI][gG][hH][tT]\"'  'RIGHT', %pop;
'\"[sS][lL][iI][vV][eE][rR]\"'  'SLIVER', %pop;
'\"[sS][qQ][uU][aA][rR][eE]\"'  'SQUARE', %pop;
'\"[sS][uU][bB][mM][iI][tT]\"'  'SUBMIT', %pop;
'\"[sS][eE][lL][eE][cC][tT][eE][dD]\"' 'SELECTED', %pop;
'\"[tT][oO][pP]\"'   'TOP', %pop;
'\"[tT][eE][aA][lL]\"'  'TEAL', %pop;
'\"[tT][eE][xX][tT]\"'  'TEXT', %pop;
'\"[wW][hH][iI][tT][eE]\"'  'WHITE', %pop;
'\"[yY][eE][lL][lL][oO][wW]\"'  'YELLOW', %pop;'[aA][lL][lL]'   ALL, 'ALL', %pop;


Produkcje :

color -> 'RGB';
color -> 'AQUA';
color -> 'BLACK';
color -> 'BLUE';
color -> 'FUCHSIA';
color -> 'GRAY';
color -> 'GREEN';
color -> 'LIME';
color -> 'MAROON';
color -> 'NAVY';
color -> 'OLIVE';
color -> 'PURPLE';
color -> 'RED';
color -> 'SLIVER';
color -> 'TEAL';
color -> 'WHITE';
color -> 'YELLOW';

data -> 'DATA';

align_val -> 'LEFT';
align_val -> 'RIGHT';
align_val -> 'CENTER';

align_special_val -> 'TOP';
align_special_val -> 'MIDDLE';
align_special_val -> 'BOTTOM';
align_special_val -> 'LEFT';
align_special_val -> 'RIGHT';

httpmethod -> 'GET';
httpmethod -> 'POST';

document -> 'DOCTYPE' html ;

html -> html_start head body '</HTML' '>';
html -> head body;

html_start -> '<HTML' 'VERSION' '=' 'STRING' '>';
html_start -> '<HTML' '>';

head -> '<HEAD' '>' head_cont '</HEAD' '>';
head -> head_cont;

head_cont -> head_cont title;
head_cont -> head_cont isindex;
head_cont -> head_cont base;
head_cont -> head_cont script;
head_cont -> head_cont style;
head_cont -> head_cont meta;
head_cont -> head_cont link;
head_cont -> ;

title -> '<TITLE' '>' data '</TITLE' '>';
title -> '<TITLE' '>' '</TITLE' '>';

isindex -> '<ISINDEX' 'PROMPT' '=' 'STRING' '>';
isindex -> '<ISINDEX' '>';

base -> '<BASE' 'HREF' '=' 'STRING' '>'; /* STRING -> URL */

script -> '<SCRIPT' '>' data '</SCRIPT' '>';

style -> '<STYLE' '>' data '</STYLE' '>';

meta -> '<META' meta_attr '>';
meta_attr -> 'CONTENT' '=' 'STRING' ;
meta_attr -> 'NAME' '=' 'STRING' 'CONTENT' '=' 'STRING' ;
meta_attr -> 'HTTP-EQUIV' '=' 'STRING' 'CONTENT' '=' 'STRING' ;

link -> '<LINK' link_attrs '>';
link_attrs -> link_attr;
link_attr -> link_attr 'REL' '=' 'STRING' ;
link_attr -> link_attr 'REV' '=' 'STRING' ;
link_attr -> link_attr 'HREF' '=' 'STRING' ;
link_attr -> link_attr 'TITLE' '=' 'STRING' ;
link_attr -> ;

body ->  '<BODY' body_attrs '>' body_cont '</BODY' '>';
body -> body_cont ;
body_attrs -> body_attr;
body_attr -> body_attr 'BACKGROUND' '=' 'STRING';
body_attr -> body_attr 'BGCOLOR' '=' color;
body_attr -> body_attr 'TEXT' '=' color;
body_attr -> body_attr 'LINK' '=' color;
body_attr -> body_attr 'VLINK' '=' color;
body_attr -> body_attr 'ALINK' '=' color;
body_attr -> ;

body_cont -> body_cont heading ;
body_cont -> body_cont text ;
body_cont -> body_cont block ;
body_cont -> body_cont address ;
body_cont -> /*empty*/;

heading -> h1;
heading -> h2;
heading -> h3;
heading -> h4;
heading -> h5;
heading -> h6;

h1 -> '<H1' h_attr '>' h_cont '</H1' '>';
h2 -> '<H2' h_attr '>' h_cont '</H2' '>';
h3 -> '<H3' h_attr '>' h_cont '</H3' '>';
h4 -> '<H4' h_attr '>' h_cont '</H4' '>';
h5 -> '<H5' h_attr '>' h_cont '</H5' '>';
h6 -> '<H6' h_attr '>' h_cont '</H6' '>';

h_attr -> 'ALIGN' '=' align_val;
h_attr -> ;

h_cont -> ;
h_cont -> h_cont text;

text -> data;
text -> font;
text -> phrase;
text -> special;
text -> forms;

font -> tt;
font -> i;
font -> b;
font -> u;
font -> strike;
font -> big;
font -> small;
font -> sub;
font -> sup;

phrase -> em;
phrase -> strong;
phrase -> dfn;
phrase -> code;
phrase -> samp;
phrase -> kbd;
phrase -> var;
phrase -> cite;

special -> a;
special -> img;
special -> applet;
special -> fonttag;
special -> basefont;
special -> br;
special -> script;
special -> map;

forms -> input;
forms -> select;
forms -> textarea;

tt   -> '<TT' '>' font_phrase_cont '</TT' '>';
i   -> '<I' '>' font_phrase_cont '</I' '>' ;
b   -> '<B' '>' font_phrase_cont '</B' '>' ;
u   -> '<U' '>' font_phrase_cont '</U' '>' ;
strike -> '<STRIKE' '>' font_phrase_cont '</STRIKE' '>';
big  -> '<BIG' '>' font_phrase_cont '</BIG' '>';
small  -> '<SMALL' '>' font_phrase_cont '</SMALL' '>';
sub  -> '<SUB' '>' font_phrase_cont '</SUB' '>';
sup  -> '<SUP' '>' font_phrase_cont '</SUP' '>';

em   -> '<EM' '>' font_phrase_cont '</EM' '>';
strong -> '<STRONG' '>' font_phrase_cont '</STRONG' '>';
dfn  -> '<DFN' '>' font_phrase_cont '</DFN' '>';
code  -> '<CODE' '>' font_phrase_cont '</CODE' '>' ;
samp  -> '<SAMP' '>' font_phrase_cont '</SAMP' '>' ;
kbd  -> '<KBD' '>' font_phrase_cont '</KBD' '>';
var  -> '<VAR' '>' font_phrase_cont '</VAR' '>';
cite  -> '<CITE' '>' font_phrase_cont '</CITE' '>' ;

font_phrase_cont -> /*empty*/;
font_phrase_cont -> font_phrase_cont text;

a   -> '<A' a_attrs '>' a_cont '</A' '>' ;
a_attrs -> a_attr ;
a_attr -> a_attr 'HREF' '=' 'STRING' ;
a_attr -> a_attr 'NAME' '=' 'STRING' ;
a_attr -> a_attr 'REL' '=' 'STRING' ;
a_attr -> a_attr 'REV' '=' 'STRING' ;
a_attr -> a_attr 'TITLE' '=' 'STRING' ;
a_attr -> ;

a_cont -> ;/*empty*/
a_cont -> a_cont text;/* blad - a nie moze zawierac w sobie innego a !!! */

img  -> '<IMG' img_attrs '>';
img_attrs -> img_attr;
img_attr -> img_attr 'SRC' '=' 'STRING' ;
img_attr -> img_attr 'ALT' '=' 'STRING' ;
img_attr -> img_attr 'ALIGN' '=' align_special_val ;
img_attr -> img_attr 'HEIGHT' '=' 'NUMBER' ;
img_attr -> img_attr 'WIDTH' '=' 'NUMBER' ;
img_attr -> img_attr 'BORDER' '=' 'NUMBER' ;
img_attr -> img_attr 'HSPACE' '=' 'NUMBER' ;
img_attr -> img_attr 'VSPACE' '=' 'NUMBER' ;
img_attr -> img_attr 'USEMAP' '=' 'STRING' ;
img_attr -> img_attr 'ISMAP' ;
img_attr -> img_attr 'ISMAP' '=' 'ISMAP' ;
img_attr -> ;/*empty*/

applet  -> '<APPLET' applet_attrs '>' applet_cont '</APPLET' '>';
applet_attrs -> applet_attr ;
applet_attr -> applet_attr 'CODEBASE' '=' 'STRING' ;
applet_attr -> applet_attr 'CODE' '=' 'STRING';
applet_attr -> applet_attr 'NAME' '=' 'STRING';
applet_attr -> applet_attr 'ALT' '=' 'STRING';
applet_attr -> applet_attr 'ALIGN' '=' align_special_val ;
applet_attr -> applet_attr 'HEIGHT' '=' 'NUMBER' ;
applet_attr -> applet_attr 'WIDTH' '=' 'NUMBER' ;
applet_attr -> applet_attr 'HSPACE' '=' 'NUMBER' ;
applet_attr -> applet_attr 'VSPACE' '=' 'NUMBER' ;
applet_attr -> ; /*empty*/

applet_cont -> applet_cont param;
applet_cont -> applet_cont text;
applet_cont -> ; /*empty*/

param   -> '<PARAM' param_attr '>' ;
param_attr -> 'NAME' '=' 'STRING' 'VALUE' '=' 'STRING';
param_attr -> 'NAME' '=' 'STRING' ;

fonttag  -> '<FONT' font_attr '>' font_cont '</FONT' '>' ;
font_attr -> 'SIZE' '=' 'SIZE_VALUE' ;
font_attr -> 'COLOR' '=' color ;
font_attr -> 'COLOR' '=' color 'SIZE' '=' 'SIZE_VALUE';
font_attr -> 'SIZE' '=' 'SIZE_VALUE' 'COLOR' '=' color ;
font_attr -> ;

font_cont -> font_cont text ;
font_cont -> ; /*empty*/

basefont -> '<BASEFONT' 'SIZE' '=' 'NUMBER' '>' ;
basefont -> '<BASEFONT' '>' ;

br -> '<BR' 'CLEAR' '=' clear_val '>' ;
br -> '<BR' '>' ;
clear_val -> 'LEFT' ;
clear_val -> 'RIGHT' ;
clear_val -> 'ALL' ;
clear_val -> 'NONE' ;

map -> '<MAP' 'NAME' '=' 'STRING' '>' map_cont '</MAP' '>';
map -> '<MAP' '>' map_cont '</MAP' '>';

map_cont -> ;/*empty*/
map_cont -> map_cont area;

area   -> '<AREA' area_attrs '>' ;
area_attrs -> area_attr ;
area_attr -> area_attr 'SHAPE' '=' shape_val;
area_attr -> area_attr 'COORDS' '=' 'STRING';
area_attr -> area_attr 'NOHREF' ;
area_attr -> area_attr 'NOHREF' '=' 'NOHREF' ;
area_attr -> area_attr 'HREF' '=' 'STRING';
area_attr -> area_attr 'ALT' '=' 'STRING';
area_attr -> ;

shape_val -> 'RECT';
shape_val -> 'CIRCLE';
shape_val -> 'POLY';
shape_val -> 'DEFAULT';

input   -> '<INPUT' input_attrs '>';
input_attrs -> input_attr ;
input_attr -> input_attr 'TYPE' '=' type_input_val;
input_attr -> input_attr 'NAME' '=' 'STRING';
input_attr -> input_attr 'VALUE' '=' 'STRING' ;
input_attr -> input_attr 'CHECKED' '=' 'CHECKED' ;
input_attr -> input_attr 'CHECKED' ;
input_attr -> input_attr 'SIZE' '=' 'NUMBER' ;
input_attr -> input_attr 'MAXLENGTH' '=' 'NUMBER' ;
input_attr -> input_attr 'SRC' '=' 'STRING' ;
input_attr -> input_attr 'ALIGN' '=' align_special_val ;
input_attr -> ;

type_input_val -> 'TEXT';
type_input_val -> 'PASSWORD';
type_input_val -> 'CHECKBOX';
type_input_val -> 'RADIO';
type_input_val -> 'SUBMIT';
type_input_val -> 'RESET';
type_input_val -> 'FILE';
type_input_val -> 'HIDDEN';
type_input_val -> 'IMAGE';

select  -> '<SELECT' select_attrs '>' select_cont '</SELECT' '>';
select_attrs -> select_attr ;
select_attr -> select_attr 'NAME' '=' 'STRING';
select_attr -> select_attr 'SIZE' '=' 'NUMBER';
select_attr -> select_attr 'MULTIPLE' '=' 'MULTIPLE' ;
select_attr -> select_attr 'MULTIPLE' ;
select_attr -> ; /*empty*/

select_cont -> select_cont option;
select_cont -> option;

option -> '<OPTION' option_attr '>' data '</OPTION' '>' ;
option -> '<OPTION' option_attr '>' data ;

option_attr -> 'VALUE' '=' 'STRING' option_attr_selected;
option_attr -> option_attr_selected 'VALUE' '=' 'STRING';
option_attr -> option_attr_selected ;

option_attr_selected -> 'SELECTED';
option_attr_selected -> 'SELECTED' '=' 'SELECTED';

textarea -> '<TEXTAREA' textarea_attr '>' data '</TEXTAREA' '>';
textarea_attr -> 'NAME' '=' 'STRING' 'ROWS' '=' 'NUMBER' 'COLS' '=' 'NUMBER';
textarea_attr -> 'NAME' '=' 'STRING' 'COLS' '=' 'NUMBER' 'ROWS' '=' 'NUMBER';
textarea_attr -> 'ROWS' '=' 'NUMBER' 'NAME' '=' 'STRING' 'COLS' '=' 'NUMBER';
textarea_attr -> 'ROWS' '=' 'NUMBER' 'COLS' '=' 'NUMBER' 'NAME' '=' 'STRING';
textarea_attr -> 'COLS' '=' 'NUMBER' 'NAME' '=' 'STRING' 'ROWS' '=' 'NUMBER';
textarea_attr -> 'COLS' '=' 'NUMBER' 'ROWS' '=' 'NUMBER' 'NAME' '=' 'STRING';

block -> p;
block -> list;
block -> preformatted;
block -> dl;
block -> div;
block -> center;
block -> blockquote;
block -> form;
block -> isindex;
block -> hr;
block -> table ;

//p -> '<P' p_attr '>' p_cont;
p -> '<P' p_attr '>' p_cont '</P' '>';

p_attr -> 'ALIGN' '=' align_val;
p_attr -> ;

p_cont -> text;//bylo empty
p_cont -> p_cont text ;

list -> ul;
list -> ol;
list -> dir;
list -> menu;

ul -> '<UL' ul_attr '>' ul_cont '</UL' '>';
ul_attr -> ul_attr_compact ul_attr_type;
ul_attr -> ul_attr_type ul_attr_compact;
ul_attr -> ul_attr_compact;
ul_attr -> ul_attr_type;
ul_attr -> ;

ul_attr_type -> 'TYPE' '=' ulstyle;
ul_attr_compact -> 'COMPACT' '=' 'COMPACT';
ul_attr_compact -> 'COMPACT';

ulstyle -> 'DISC';
ulstyle -> 'SQUARE';
ulstyle -> 'CIRCLE';

ul_cont -> ul_cont ul_li ;
ul_cont -> ; /*empty*/

ul_li -> '<LI' ul_li_attr '>' flow '</LI' '>';
ul_li -> '<LI' ul_li_attr '>' flow ;

ul_li_attr -> 'TYPE' '=' ulstyle;
ul_li_attr -> 'VALUE' '=' 'NUMBER' ;
ul_li_attr -> 'VALUE' '=' 'NUMBER' 'TYPE' '=' ulstyle;
ul_li_attr -> 'TYPE' '=' ulstyle 'VALUE' '=' 'NUMBER';
ul_li_attr -> ;

flow -> flow text;
flow -> flow block;
flow -> ; /*empty*/

ol   -> '<OL' ol_attrs '>' ol_cont '</OL' '>' ;
ol_attrs -> ol_attr ;
ol_attr -> ol_attr 'TYPE' '=' 'STRING';
ol_attr -> ol_attr 'TYPE' '=' 'NUMBER';
ol_attr -> ol_attr 'START' '=' 'NUMBER';
ol_attr -> ol_attr 'COMPACT' '=' 'COMPACT';
ol_attr -> ol_attr 'COMPACT';
ol_attr -> ; /*empty*/

ol_cont -> ol_cont ol_li ;
ol_cont -> ;/*empty*/

ol_li   -> '<LI' ol_li_attr '>' flow '</LI' '>' ;
ol_li   -> '<LI' ol_li_attr '>' flow ;
ol_li_attr -> ol_li_attr_type 'VALUE' '=' 'NUMBER' ;
ol_li_attr -> 'VALUE' '=' 'NUMBER' ol_li_attr_type ;
ol_li_attr -> ol_li_attr_type ;
ol_li_attr -> 'VALUE' '=' 'NUMBER' ;
ol_li_attr -> ;

ol_li_attr_type -> 'TYPE' '=' 'STRING' ;
ol_li_attr_type -> 'TYPE' '=' 'NUMBER' ;

dir -> '<DIR' dir_menu_attr '>' dir_menu_cont '</DIR' '>' ;
dir_menu_attr -> 'COMPACT' '=' 'COMPACT' ;
dir_menu_attr -> 'COMPACT' ;
dir_menu_attr -> ;/*empty*/

dir_menu_cont -> dir_menu_cont text ;
dir_menu_cont -> ;

menu -> '<MENU' dir_menu_attr '>' dir_menu_cont '</MENU' '>';

preformatted -> pre ; /* xmp listing ? */

pre  -> '<PRE' pre_attr '>' pre_cont '</PRE' '>' ;
pre_attr -> 'WIDTH' '=' 'NUMBER' ;
pre_attr -> ;/*empty*/

dl -> '<DL' dl_attr '>' dl_cont '</DL' '>' ;
dl_attr -> 'COMPACT' '=' 'COMPACT' ;
dl_attr -> 'COMPACT' ;
dl_attr -> ;/*empty*/

dl_cont -> dl_cont dt ;
dl_cont -> dl_cont dd ;
dl_cont -> ;/*empty*/

dt -> '<DT' '>' dt_cont '</DT' '>' ;
dt -> '<DT' '>' dt_cont ;

dt_cont -> dt_cont text ;
dt_cont -> ;/*empty*/

dd -> '<DD' '>' flow '</DD' '>' ;
dd -> '<DD' '>' flow  ;

div -> '<DIV' 'ALIGN' '=' align_val '>' body_cont '</DIV' '>' ;
div -> '<DIV' '>' body_cont '</DIV' '>' ;

center -> '<CENTER' '>' body_cont '</CENTER' '>' ;

blockquote -> '<BLOCKQUOTE' '>' body_cont '</BLOCKQUOTE' '>' ;

form   -> '<FORM' form_attrs '>' form_cont '</FORM' '>' ;
form_attrs -> form_attr ;
form_attr -> form_attr 'ACTION' '=' 'STRING';
form_attr -> form_attr 'METHOD' '=' httpmethod ;
form_attr -> form_attr 'ENCTYPE' '=' 'STRING' ;
form_attr -> ;

form_cont -> body_cont ;

hr   -> '<HR' hr_attrs '>' ;
hr_attrs -> hr_attr ;
hr_attr -> hr_attr 'ALIGN' '=' align_val ;
hr_attr -> hr_attr 'NOSHADE' ;
hr_attr -> hr_attr 'NOSHADE' '=' 'NOSHADE' ;
hr_attr -> hr_attr 'SIZE' '=' 'NUMBER' ;
hr_attr -> hr_attr 'WIDTH' '=' 'NUMBER' ;
hr_attr -> hr_attr 'WIDTH' '=' 'PERCENT' ;
hr_attr -> ;/*empty*/

table   -> '<TABLE' table_attrs '>' table_cont '</TABLE' '>' ;
table_attrs -> table_attr;
table_attr -> table_attr 'ALIGN' '=' align_val ;
table_attr -> table_attr 'WIDTH' '=' 'NUMBER' ;
table_attr -> table_attr 'WIDTH' '=' 'PERCENT' ;
table_attr -> table_attr 'BORDER' '=' 'NUMBER' ;
table_attr -> table_attr 'BORDER' ;
table_attr -> table_attr 'BORDER' '=' 'BORDER' ;
table_attr -> table_attr 'CELLSPACING' '=' 'NUMBER' ;
table_attr -> table_attr 'CELLPADDING' '=' 'NUMBER' ;
table_attr -> ; /*empty*/

table_cont -> caption table_cont1 ;
table_cont -> table_cont1 ;

table_cont1 -> tr ;
table_cont1 -> table_cont1 tr ;

caption -> '<CAPTION' caption_attr '>' caption_cont '</CAPTION' '>' ;
caption_attr -> 'ALIGN' '=' 'TOP' ;
caption_attr -> 'ALIGN' '=' 'BOTTOM' ;
caption_attr -> ;

caption_cont -> ;/*empty*/
caption_cont -> caption_cont text ;

tr -> '<TR' tr_attr '>' tr_cont '</TR' '>' ;
tr -> '<TR' tr_attr '>' tr_cont ;

tr_attr -> 'ALIGN' '=' align_val 'VALIGN' '=' valign_val ;
tr_attr -> 'VALIGN' '=' valign_val 'ALIGN' '=' align_val ;
tr_attr -> 'VALIGN' valign_val ;
tr_attr -> 'ALIGN' '=' align_val ;
tr_attr -> ;

valign_val -> 'TOP';
valign_val -> 'MIDDLE';
valign_val -> 'BOTTOM';
valign_val -> 'BASELINE';

tr_cont -> tr_cont td ;
tr_cont -> tr_cont th ;
tr_cont -> ;/*empty*/

th -> '<TH' th_td_attrs '>' body_cont '</TH' '>' ;
th -> '<TH' th_td_attrs '>' body_cont ;

th_td_attrs -> th_td_attr ;
th_td_attr -> th_td_attr 'ROWSPAN' '=' 'NUMBER' ;
th_td_attr -> th_td_attr 'COLSPAN' '=' 'NUMBER' ;
th_td_attr -> th_td_attr 'NOWRAP' ;
th_td_attr -> th_td_attr 'NOWRAP' '=' 'NOWRAP' ;
th_td_attr -> th_td_attr 'ALIGN' '=' align_val ;
th_td_attr -> th_td_attr 'VALIGN' '=' valign_val ;
th_td_attr -> th_td_attr 'WIDTH' '=' 'NUMBER' ;
th_td_attr -> th_td_attr 'HEIGHT' '=' 'NUMBER' ;
th_td_attr -> ; /*empty*/

td -> '<TD' th_td_attrs '>' body_cont '</TD' '>' ;
td -> '<TD' th_td_attrs '>' body_cont ;

address   -> '<ADDRESS' '>' address_cont '</ADDRESS' '>' ;
address_cont -> address_cont p ;
address_cont -> address_cont text ;
address_cont -> ;


Copyright (C) 1999 by Marek Gryber