The grammar is a composite of the HTML 2.0 standard tags and special
extensions to the language as enabled by the latest versions of NCSA
Mosaic, Netscape Communication's Netscape Navigator, and Microsoft's
Internet Explorer.

The rules are in alphabetical order. The starting rule for
an entire document is named html_document.

a_tag

::=

<a>

{a_content }0

</a>

a_content

::=

heading

|

text

address_tag

::=

<address>

{address_content }0

</address>

address_content

::=

p_tag

|

text

applet_content

::=

{<param>}0

body_content

applet_tag

::=

<applet>

applet_content

</applet>

a_content
may not contain a_tags; you may not nest <a>
tags within other <a> tags.

b_tag

::=

<b>text</b>

basefont_tag

::=

<basefont>

body_content

</basefont>

big_tag

::=

<big>text</big>

blink_tag

::=

<blink>text</blink>

block

::=

{block_content }0

block_content

::=

<isindex>

|

basefont_tag

|

blockquote_tag

|

center_tag

|

dir_tag

|

div_tag

|

dl_tag

|

form_tag

|

listing_tag

|

menu_tag

|

multicol_tag

|

nobr_tag

|

ol_tag

|

p_tag

|

pre_tag

|

table_tag

|

ul_tag

|

xmp_tag

blockquote_tag

::=

<blockquote>

body_content

</blockquote>

body_content

::=

<bgsound>

|

<hr>

|

address_tag

|

block

|

heading

|

layer_tag

|

map_tag

|

marquee_tag

|

text

body_tag

::=

<body>

{body_content }0

</body>

caption_tag

::=

<caption>

body_content

</caption>

center_tag

::=

<center>

body_content

</center>

cite_tag

::=

<cite>text</cite>

code_tag

::=

<code>text</code>

colgroup_content

::=

{<col>}0

colgroup_tag

::=

<colgroup>

colgroup_content

content_style

::=

cite_tag

|

code_tag

|

dfn_tag

|

em_tag

|

kbd_tag

|

samp_tag

|

strong_tag

|

var_tag

dd_tag

::=

<dd>

flow

</dd>

dfn_tag

::=

<dfn>text</dfn>

dir_tag

::=

<dir>

{ li_tag }

</dir>

div_tag

::=

<div>

body_content

</div>

dl_content

::=

dt_tagdd_tag

The li_tag
within the dir_tag may not contain any element
found in a block.

dl_tag

::=

<dl>

{dl_content }

</dl>

dt_tag

::=

<dt>

text

</dt>

em_tag

::=

<em>text</em>

flow

::=

{flow_content }0

flow_content

::=

block

|

text

font_tag

::=

<font>style_text</font>

form_content

::=

<input>

|

<keygen>

|

body_content

|

select_tag

|

textarea_tag

form_tag

::=

<form>

{form_content }0

</form>

frameset_content

::=

<frame>

|

noframes_tag

frameset_tag

::=

<frameset>

{frameset_content }0

</frameset>

h1_tag

::=

<h1>text</h1>

h2_tag

::=

<h2>text</h2>

h3_tag

::=

<h3>text</h3>

h4_tag

::=

<h4>text</h4>

h5_tag

::=

<h5>text</h5>

h6_tag

::=

<h6>text</h6>

head_content

::=

<base>

|

<isindex>

|

<link>

|

<meta>

|

<nextid>

form_content
may not contain form_tags; you may not nest
one <form> within another <form>.

|

style_tag

|

title_tag

head_tag

::=

<head>

{head_content }0

</head>

heading

::=

h1_tag

|

h2_tag

|

h3_tag

|

h4_tag

|

h5_tag

|

h6_tag

html_content

::=

head_tag body_tag

|

head_tag frameset_tag

html_document

::=

html_tag

html_tag

::=

<html>

html_content

</html>

i_tag

::=

<i>text</i>

ilayer_tag

::=

<ilayer>

body_content

</ilayer>

kbd_tag

::=

<kbd>text</kbd>

layer_tag

::=

<layer>

body_content

</layer>

li_tag

::=

<li>

flow

</li>

listing_tag

::=

<listing>

literal_text

</listing>

map_content

::=

{<area>}0

map_tag

::=

<map>

map_content

</map>

marquee_tag

::=

<marquee>

style_text

</marquee>

menu_tag

::=

<menu>

{li_tag }0

</menu>

multicol_tag

::=

<multicol>

body_content

</multicol>

nobr_tag

::=

<nobr>text</nobr>

noembed_tag

::=

<noembed>text</noembed>

noframes_tag

::=

<noframes>

{body_content }0

</noframes>

noscript_tag

::=

<noscript>text</noscript>

object_content

::=

{<param>}0

body_content

object_tag

::=

<object>

object_content

</object>

ol_tag

::=

<ol>

{li_tag }

</ol>

option_tag

::=

<option>

plain_text

</option>

p_tag

::=

<p>

text

</p>

physical_style

::=

b_tag

|

big_tag

|

blink_tag

|

font_tag

|

i_tag

|

s_tag

|

small_tag

|

span_tag

The li_tag
within the menu_tag may not contain any element
found in a block.

|

strike_tag

|

sub_tag

|

sup_tag

|

tt_tag

|

u_tag

pre_content

::=

<br>

|

<hr>

|

a_tag

|

style_text

pre_tag

::=

<pre>

{pre_content }0

</pre>

s_tag

::=

<s>text</s>

samp_tag

::=

<samp>text</samp>

script_tag

::=

<script>plain_text</script>

select_tag

::=

<select>

{option_tag }

</select>

server_tag

::=

<server>plain_text</server>

small_tag

::=

<small>text</small>

span_tag

::=

<span>text</span>

strike_tag

::=

<strike>text</strike>

strong_tag

::=

<strong>text</strong>

style_tag

::=

<style> plain_text</style>

sub_tag

::=

<sub>text</sub>

sup_tag

::=

<sup>text</sup>

table_cell

::=

td_tag

|

th_tag

table_content

::=

<tbody>

|

<tfoot>

|

<thead>

|

tr_tag

A script_tag
may be placed anywhere within an HTML document, without regard to
syntactic rules.A server_tag may
be placed anywhere within an HTML document, without regard to syntactic
rules.