2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
< title > 3/aap< / title >
2020-03-19 02:11:25 +02:00
< meta name = "viewport" content = "width=device-width initial-scale=1" >
2019-03-17 14:40:57 +02:00
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
2020-03-19 02:11:25 +02:00
< link href = "../inweb.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2019-03-17 14:40:57 +02:00
< / head >
< body >
2020-03-19 02:11:25 +02:00
< nav role = "navigation" >
< h1 > < a href = "../webs.html" > Sources< / a > < / h1 >
< ul >
2020-03-28 21:42:53 +02:00
< li > < a href = "../compiler.html" > < b > compiler tools< / b > < / a > < / li >
2020-03-19 02:11:25 +02:00
< li > < a href = "../other.html" > other tools< / a > < / li >
< li > < a href = "../extensions.html" > extensions and kits< / a > < / li >
< li > < a href = "../units.html" > unit test tools< / a > < / li >
< / ul >
< h2 > Compiler Webs< / h2 >
< ul >
< li > < a href = "../inbuild/index.html" > inbuild< / a > < / li >
< li > < a href = "../inform7/index.html" > inform7< / a > < / li >
< li > < a href = "../inter/index.html" > inter< / a > < / li >
< / ul >
< h2 > Inbuild Modules< / h2 >
< ul >
< li > < a href = "../inbuild-module/index.html" > inbuild< / a > < / li >
< li > < a href = "../arch-module/index.html" > arch< / a > < / li >
< li > < a href = "../words-module/index.html" > words< / a > < / li >
< li > < a href = "../syntax-module/index.html" > syntax< / a > < / li >
< li > < a href = "../html-module/index.html" > html< / a > < / li >
< / ul >
< h2 > Inform7 Modules< / h2 >
< ul >
< li > < a href = "../core-module/index.html" > core< / a > < / li >
< li > < a href = "../problems-module/index.html" > problems< / a > < / li >
< li > < a href = "../inflections-module/index.html" > inflections< / a > < / li >
< li > < a href = "../linguistics-module/index.html" > linguistics< / a > < / li >
< li > < a href = "../kinds-module/index.html" > kinds< / a > < / li >
< li > < a href = "../if-module/index.html" > if< / a > < / li >
< li > < a href = "../multimedia-module/index.html" > multimedia< / a > < / li >
< li > < a href = "../index-module/index.html" > index< / a > < / li >
< / ul >
< h2 > Inter Modules< / h2 >
< ul >
< li > < a href = "../inter-module/index.html" > inter< / a > < / li >
< li > < a href = "../building-module/index.html" > building< / a > < / li >
< li > < a href = "../codegen-module/index.html" > codegen< / a > < / li >
< / ul >
< h2 > Foundation< / h2 >
< ul >
< li > < a href = "../../../inweb/docs/foundation-module/index.html" > foundation< / a > < / li >
< / ul >
< / nav >
< main role = "main" >
2019-03-17 14:40:57 +02:00
<!-- Weave of '3/cao' generated by 7 -->
2020-03-22 12:50:19 +02:00
< ul class = "crumbs" > < li > < a href = "../webs.html" > Source< / a > < / li > < li > < a href = "../compiler.html" > Compiler Modules< / a > < / li > < li > < a href = "index.html" > linguistics< / a > < / li > < li > < a href = "index.html#3" > Chapter 3: Grammatical Categories I< / a > < / li > < li > < b > Cardinals and Ordinals< / b > < / li > < / ul > < p class = "purpose" > To parse integers seen from a grammatical point of view.< / p >
2019-03-17 14:40:57 +02:00
< ul class = "toc" > < li > < a href = "#SP1" > § 1. Cardinal and ordinal numbers< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. Cardinal and ordinal numbers. < / b > We read a few low numbers in text, but larger numbers only in digits. Textual
numbers run from 0 to 12 since that's what clocks need.
< / p >
< p class = "inwebparagraph" > By a cardinal we mean a number such as < code class = "display" > < span class = "extract" > five< / span > < / code > or < code class = "display" > < span class = "extract" > 351< / span > < / code > .
< / p >
< pre class = "display" >
< span class = "plain" > < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > ::=< / span >
< span class = "identifier" > zero< / span > < span class = "plain" > |< / span >
< span class = "identifier" > one< / span > < span class = "plain" > |< / span >
< span class = "identifier" > two< / span > < span class = "plain" > |< / span >
< span class = "identifier" > three< / span > < span class = "plain" > |< / span >
< span class = "identifier" > four< / span > < span class = "plain" > |< / span >
< span class = "identifier" > five< / span > < span class = "plain" > |< / span >
< span class = "identifier" > six< / span > < span class = "plain" > |< / span >
< span class = "identifier" > seven< / span > < span class = "plain" > |< / span >
< span class = "identifier" > eight< / span > < span class = "plain" > |< / span >
< span class = "identifier" > nine< / span > < span class = "plain" > |< / span >
< span class = "identifier" > ten< / span > < span class = "plain" > |< / span >
< span class = "identifier" > eleven< / span > < span class = "plain" > |< / span >
< span class = "identifier" > twelve< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. < / b > And by an ordinal we mean a number such as < code class = "display" > < span class = "extract" > fifth< / span > < / code > or < code class = "display" > < span class = "extract" > 351st< / span > < / code > ; note that
this is not a noun, and isn't allowed as a constant value in Inform.
< / p >
< pre class = "display" >
< span class = "plain" > < < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > ::=< / span >
< span class = "identifier" > zeroth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > first< / span > < span class = "plain" > |< / span >
< span class = "identifier" > second< / span > < span class = "plain" > |< / span >
< span class = "identifier" > third< / span > < span class = "plain" > |< / span >
< span class = "identifier" > fourth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > fifth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > sixth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > seventh< / span > < span class = "plain" > |< / span >
< span class = "identifier" > eighth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > ninth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > tenth< / span > < span class = "plain" > |< / span >
< span class = "identifier" > eleventh< / span > < span class = "plain" > |< / span >
< span class = "identifier" > twelfth< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. < / b > Those two nonterminals here simply supply text: for efficiency reasons we
don't actually parse them, although they would give the correct response if
we did. Instead they're scanned for words which are marked with the appropriate
numbers.
< / p >
< pre class = "display" >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Cardinals::preform_optimiser< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > Preform::mark_nt_as_requiring_itself_conj< / span > < span class = "plain" > (< < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > );< / span >
< span class = "identifier" > Preform::mark_nt_as_requiring_itself_conj< / span > < span class = "plain" > (< < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > );< / span >
2020-04-07 03:06:09 +03:00
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > wn< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ; < / span > < span class = "identifier" > wn< / span > < span class = "plain" > < < / span > < span class = "identifier" > lexer_wordcount< / span > < span class = "plain" > ; < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ++) {< / span >
2019-03-17 14:40:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > Vocabulary::test_flags< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > , < / span > < span class = "identifier" > NUMBER_MC< / span > < span class = "plain" > ))< / span >
< span class = "functiontext" > Cardinals::mark_as_cardinal< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > ));< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > Vocabulary::test_flags< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > , < / span > < span class = "identifier" > ORDINAL_MC< / span > < span class = "plain" > ))< / span >
< span class = "functiontext" > Cardinals::mark_as_ordinal< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > ));< / span >
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Cardinals::mark_as_cardinal< / span > < span class = "plain" > (< / span > < span class = "identifier" > vocabulary_entry< / span > < span class = "plain" > *< / span > < span class = "identifier" > ve< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > Preform::set_nt_incidence< / span > < span class = "plain" > (< / span > < span class = "identifier" > ve< / span > < span class = "plain" > , < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > );< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Cardinals::mark_as_ordinal< / span > < span class = "plain" > (< / span > < span class = "identifier" > vocabulary_entry< / span > < span class = "plain" > *< / span > < span class = "identifier" > ve< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > Preform::set_nt_incidence< / span > < span class = "plain" > (< / span > < span class = "identifier" > ve< / span > < span class = "plain" > , < < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > );< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Cardinals::enable_in_word_form< / span > < span class = "plain" > (< / span > < span class = "reserved" > void< / span > < span class = "plain" > ) {< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > Preform::assign_bitmap_bit< / span > < span class = "plain" > (< < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > , < / span > < span class = "constant" > 0< / span > < span class = "plain" > );< / span >
< span class = "identifier" > Preform::assign_bitmap_bit< / span > < span class = "plain" > (< < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > , < / span > < span class = "constant" > 1< / span > < span class = "plain" > );< / span >
2019-03-17 14:40:57 +02:00
< span class = "plain" > < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > -> < / span > < span class = "identifier" > number_words_by_production< / span > < span class = "plain" > = < / span > < span class = "identifier" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > -> < / span > < span class = "identifier" > flag_words_in_production< / span > < span class = "plain" > = < / span > < span class = "identifier" > NUMBER_MC< / span > < span class = "plain" > ;< / span >
< span class = "plain" > < < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > -> < / span > < span class = "identifier" > number_words_by_production< / span > < span class = "plain" > = < / span > < span class = "identifier" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > < < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > in< / span > < span class = "plain" > -< / span > < span class = "identifier" > words< / span > < span class = "plain" > > -> < / span > < span class = "identifier" > flag_words_in_production< / span > < span class = "plain" > = < / span > < span class = "identifier" > ORDINAL_MC< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-03-28 17:00:33 +02:00
< p class = "endnote" > The function Cardinals::preform_optimiser is used in 1/lm (< a href = "1-lm.html#SP5" > § 5< / a > ).< / p >
2019-03-17 14:40:57 +02:00
2020-03-28 17:00:33 +02:00
< p class = "endnote" > The function Cardinals::mark_as_cardinal is used in 2/em (< a href = "2-em.html#SP6" > § 6< / a > ).< / p >
2019-03-17 14:40:57 +02:00
2020-03-28 17:00:33 +02:00
< p class = "endnote" > The function Cardinals::mark_as_ordinal is used in 2/em (< a href = "2-em.html#SP6" > § 6< / a > ).< / p >
2019-03-17 14:40:57 +02:00
< p class = "endnote" > The function Cardinals::enable_in_word_form is used in 1/lm (< a href = "1-lm.html#SP3" > § 3< / a > ).< / p >
< p class = "inwebparagraph" > < a id = "SP4" > < / a > < b > § 4. < / b > Actual parsing is done here. We look at a single word to see if it's a
number literal: either one of the named cases above, or a number written out
in decimal digits, perhaps with a minus sign.
< / p >
< pre class = "display" >
2020-04-07 03:06:09 +03:00
< span class = "plain" > < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > < / span > < span class = "identifier" > internal< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > {< / span >
2019-03-17 14:40:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > Vocabulary::test_flags< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > ), < / span > < span class = "identifier" > NUMBER_MC< / span > < span class = "plain" > )) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > X< / span > < span class = "plain" > = < / span > < span class = "identifier" > Vocabulary::get_literal_number_value< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > )));< / span >
< < span class = "cwebmacro" > In Inform 7 only, check that the number is representable in the VM< / span > < span class = "cwebmacronumber" > 4.1< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
2020-04-07 03:06:09 +03:00
< span class = "plain" > < < / span > < span class = "identifier" > ordinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > > < / span > < span class = "identifier" > internal< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > {< / span >
2019-03-17 14:40:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > Vocabulary::test_flags< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > ), < / span > < span class = "identifier" > ORDINAL_MC< / span > < span class = "plain" > )) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > X< / span > < span class = "plain" > = < / span > < span class = "identifier" > Vocabulary::get_literal_number_value< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > )));< / span >
< < span class = "cwebmacro" > In Inform 7 only, check that the number is representable in the VM< / span > < span class = "cwebmacronumber" > 4.1< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP4_1" > < / a > < b > § 4.1. < / b > These mustn't match any number too large to fit into the virtual machine
being compiled to, so "42000", for instance, is not a valid literal if Inform
is parsing text in a work intended for the 16-bit Z-machine.
< / p >
< p class = "inwebparagraph" > Why do we catch this here? The answer is probably that it's an excess of
caution, but this is a rare case where the choice of virtual machine affects
the legal syntax for Inform source text — text originally written for use on
Glulx, which allows for larger integers, might be moved over to a Z-machine
project, with the user not realising the consequences.
< / p >
< p class = "macrodefinition" > < code class = "display" >
< < span class = "cwebmacrodefn" > In Inform 7 only, check that the number is representable in the VM< / span > < span class = "cwebmacronumber" > 4.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "plain" > #< / span > < span class = "identifier" > ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > CORE_MODULE< / span >
2020-02-27 03:43:11 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > FundamentalConstants::veto_number< / span > < span class = "plain" > (*< / span > < span class = "identifier" > X< / span > < span class = "plain" > )) {< / span >
2019-03-17 14:40:57 +02:00
< span class = "comment" > to prevent repetitions:< / span >
2020-04-07 03:06:09 +03:00
< span class = "identifier" > Vocabulary::set_literal_number_value< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > )), < / span > < span class = "constant" > 1< / span > < span class = "plain" > );< / span >
2019-03-17 14:40:57 +02:00
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "plain" > #< / span > < span class = "identifier" > endif< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP4" > § 4< / a > (twice).< / p >
< p class = "inwebparagraph" > < a id = "SP5" > < / a > < b > § 5. < / b > A small variation which lifts this restriction on the number range:
< / p >
< pre class = "display" >
2020-04-07 03:06:09 +03:00
< span class = "plain" > < < / span > < span class = "identifier" > cardinal< / span > < span class = "plain" > -< / span > < span class = "identifier" > number< / span > < span class = "plain" > -< / span > < span class = "identifier" > unlimited< / span > < span class = "plain" > > < / span > < span class = "identifier" > internal< / span > < span class = "plain" > < / span > < span class = "constant" > 1< / span > < span class = "plain" > {< / span >
2019-03-17 14:40:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > Vocabulary::test_flags< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > ), < / span > < span class = "identifier" > NUMBER_MC< / span > < span class = "plain" > )) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > X< / span > < span class = "plain" > = < / span > < span class = "identifier" > Vocabulary::get_literal_number_value< / span > < span class = "plain" > (< / span > < span class = "identifier" > Lexer::word< / span > < span class = "plain" > (< / span > < span class = "identifier" > Wordings::first_wn< / span > < span class = "plain" > (< / span > < span class = "identifier" > W< / span > < span class = "plain" > )));< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< hr class = "tocbar" >
< ul class = "toc" > < li > < a href = "3-aap.html" > Back to 'Articles and Pronouns'< / a > < / li > < li > < a href = "3-daq.html" > Continue with 'Determiners and Quantifiers'< / a > < / li > < / ul > < hr class = "tocbar" >
2019-04-22 17:42:10 +03:00
<!-- End of weave -->
2020-03-19 02:11:25 +02:00
< / main >
2019-03-17 14:40:57 +02:00
< / body >
< / html >