2020-01-10 01:10:09 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
2020-04-14 19:56:54 +03:00
< title > Number Template< / title >
2020-05-03 03:20:55 +03:00
< link href = "../docs-assets/Breadcrumbs.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-03-19 02:11:25 +02:00
< meta name = "viewport" content = "width=device-width initial-scale=1" >
2020-01-10 01:10:09 +02:00
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
2020-05-03 03:01:21 +03:00
2020-05-03 03:20:55 +03:00
< link href = "../docs-assets/Contents.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< link href = "../docs-assets/Progress.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< link href = "../docs-assets/Navigation.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< link href = "../docs-assets/Fonts.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< link href = "../docs-assets/Base.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-05-03 03:01:21 +03:00
< script >
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
< / script >
< script type = "text/javascript" id = "MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
< / script >
2020-05-03 03:20:55 +03:00
< link href = "../docs-assets/Colours.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-04-14 19:56:54 +03:00
2020-01-10 01:10:09 +02:00
< / head >
2020-05-03 03:01:21 +03:00
< body class = "commentary-font" >
2020-03-19 02:11:25 +02:00
< nav role = "navigation" >
2020-04-14 19:56:54 +03:00
< h1 > < a href = "../index.html" >
2020-05-03 18:34:53 +03:00
< img src = "../docs-assets/Inform.png" height = 72" >
2020-04-14 19:56:54 +03:00
< / a > < / h1 >
2022-04-04 20:31:44 +03:00
< ul > < li > < a href = "../index.html" > home< / a > < / li >
< / ul > < h2 > Compiler< / h2 > < ul >
< li > < a href = "../structure.html" > structure< / a > < / li >
< li > < a href = "../inbuildn.html" > inbuild< / a > < / li >
< li > < a href = "../inform7n.html" > inform7< / a > < / li >
< li > < a href = "../intern.html" > inter< / a > < / li >
< li > < a href = "../services.html" > services< / a > < / li >
2022-04-18 17:46:46 +03:00
< li > < a href = "../secrets.html" > secrets< / a > < / li >
2022-04-04 20:31:44 +03:00
< / ul > < h2 > Other Tools< / h2 > < ul >
< li > < a href = "../inblorbn.html" > inblorb< / a > < / li >
< li > < a href = "../indocn.html" > indoc< / a > < / li >
< li > < a href = "../inform6.html" > inform6< / a > < / li >
< li > < a href = "../inpolicyn.html" > inpolicy< / a > < / li >
< li > < a href = "../inrtpsn.html" > inrtps< / a > < / li >
2022-04-08 00:37:19 +03:00
< / ul > < h2 > Resources< / h2 > < ul >
< li > < a href = "../extensions.html" > extensions< / a > < / li >
< li > < a href = "../kits.html" > kits< / a > < / li >
2022-04-04 20:31:44 +03:00
< / ul > < h2 > Repository< / h2 > < ul >
< li > < a href = "https://github.com/ganelson/inform" > < img src = "../docs-assets/github.png" height = 18 > github< / a > < / li >
< / ul > < h2 > Related Projects< / h2 > < ul >
2022-05-16 17:32:53 +03:00
< li > < a href = "../../../inweb/index.html" > inweb< / a > < / li >
< li > < a href = "../../../intest/index.html" > intest< / a > < / li >
2020-03-19 02:11:25 +02:00
2020-04-14 19:56:54 +03:00
< / ul >
2020-03-19 02:11:25 +02:00
< / nav >
< main role = "main" >
2020-05-03 03:01:21 +03:00
<!-- Weave of 'Number Template' generated by Inweb -->
< div class = "breadcrumbs" >
< ul class = "crumbs" > < li > < a href = "../index.html" > Home< / a > < / li > < li > < a href = "../extensions.html" > Kits< / a > < / li > < li > < a href = "index.html" > CommandParserKit< / a > < / li > < li > < b > Number Template< / b > < / li > < / ul > < / div >
< p class = "purpose" > Support for parsing integers.< / p >
2020-01-10 01:10:09 +02:00
2020-04-16 01:49:59 +03:00
< ul class = "toc" > < li > < a href = "S-tkn.html#SP1" > § 1. Understanding< / a > < / li > < li > < a href = "S-tkn.html#SP2" > § 2. Truth states< / a > < / li > < li > < a href = "S-tkn.html#SP3" > § 3. Real numbers< / a > < / li > < / ul > < hr class = "tocbar" >
2020-01-10 01:10:09 +02:00
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1" class = "paragraph-anchor" > < / a > < b > § 1. Understanding. < / b > In our target virtual machines, numbers are stored in twos-complement form,
2020-04-14 19:56:54 +03:00
so that a 16-bit VM can hold the range of integers \(-2^{15} = -32768\) to
\(2^{15}-1 = +32767\), while a 32-bit VM can hold \(-2^{31} = -2147483648\) to
\(2^{31}-1 = +2147483647\): the token below accepts exactly those ranges.
2020-01-10 01:10:09 +02:00
< / p >
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > [ < / span > < span class = "identifier-syntax" > DECIMAL_TOKEN< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wnc< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wna< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > base< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > group_wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wnc< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > group_wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > DECIMAL_TOKEN_INNER< / span > < span class = "plain-syntax" > ();< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > ~= < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wnc< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > ParseTokenStopped< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ELEMENTARY_TT< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NUMBER_TOKEN< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > GPR_NUMBER< / span > < span class = "plain-syntax" > ) & & (< / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > ~= < / span > < span class = "constant-syntax" > 10000< / span > < span class = "plain-syntax" > )) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wnc< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > WordAddress< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > WordLength< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > base< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 10< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > -> 0 ~= < / span > < span class = "character-syntax" > '-'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '$'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '0'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '1'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '2'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '3'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '4'< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '5'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '6'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '7'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '8'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '9'< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > -> 0 == < / span > < span class = "character-syntax" > '-'< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > = -1; < / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > --; < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > ++; }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > while< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > -> 0 > = < / span > < span class = "character-syntax" > 'a'< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > -> 0 - < / span > < span class = "character-syntax" > 'a'< / span > < span class = "plain-syntax" > + < / span > < span class = "constant-syntax" > 10< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > -> 0 - < / span > < span class = "character-syntax" > '0'< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > switch< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > base< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 2< / span > < span class = "plain-syntax" > : < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 17< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 10< / span > < span class = "plain-syntax" > :< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > Iftrue< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > WORDSIZE< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 2< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 6< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 5< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 3276< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 3276< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 7< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > == -1 & & < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 8< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > Ifnot< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > i.e., if (WORDSIZE == 4)< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 11< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 10< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 214748364< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 214748364< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 7< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > == -1 & & < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 8< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > Endif< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 16< / span > < span class = "plain-syntax" > : < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit_count< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 5< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > < < / span > < span class = "identifier-syntax" > base< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > base< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > + < / span > < span class = "identifier-syntax" > digit< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wl< / span > < span class = "plain-syntax" > --; < / span > < span class = "identifier-syntax" > wa< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > sign< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_NUMBER< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > ];< / span >
2020-01-10 01:10:09 +02:00
< / pre >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP2" class = "paragraph-anchor" > < / a > < b > § 2. Truth states. < / b > And although truth states are not strictly speaking numbers, this seems as
2020-01-10 01:10:09 +02:00
good a point as any to parse them:
< / p >
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > [ < / span > < span class = "identifier-syntax" > TRUTH_STATE_TOKEN< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUTH_STATE_TOKEN_INNER< / span > < span class = "plain-syntax" > ();< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > ~= < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NextWordStopped< / span > < span class = "plain-syntax" > ();< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > == < / span > < span class = "character-syntax" > 'true'< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_NUMBER< / span > < span class = "plain-syntax" > ; }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wd< / span > < span class = "plain-syntax" > == < / span > < span class = "character-syntax" > 'false'< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_NUMBER< / span > < span class = "plain-syntax" > ; }< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > original_wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > ];< / span >
2020-01-10 01:10:09 +02:00
< / pre >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP3" class = "paragraph-anchor" > < / a > < b > § 3. Real numbers. < / b > An I6 grammar routine (GPR) for floats. On success, this returns
2020-01-10 01:10:09 +02:00
GPR_NUMBER and stores a value in the global parsed_number.
< / p >
2020-05-03 03:01:21 +03:00
< p class = "commentary" > This is quite a nuisance, actually, because "." is a word separator.
2020-01-10 01:10:09 +02:00
Also, we want to accept command sequences like "type 4. look"So we
need to collect a set of words made up of digits, signs, periods, and
the letter "e", but without any intervening whitespace, and excluding
a trailing period.
< / p >
2020-05-03 03:01:21 +03:00
< p class = "commentary" > (This will fail to correctly parse "type 4.e", but I think that is a
2020-01-10 01:10:09 +02:00
small flaw. A player would more likely try "type 4. e" or, really,
not concatenate commands at all. It will also parse "type 4. on keyboard"
as two commands, even though "4." is a legitimate float literal.
Contrariwise, "type 4. x me" will be taken as one command. (Because the "x"
*could* be a continuation of the float, and I don't back up when it turns
out not to be.) I don't plan to worry about these cases.)
< / p >
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > Ifdef< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > TARGET_GLULX< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > [ < / span > < span class = "identifier-syntax" > FLOAT_TOKEN< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > buf< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ch< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > firstwd< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > lastchar< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > lastwasdot< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > > < / span > < span class = "identifier-syntax" > num_words< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > We're going to collect a set of words. Start with zero words.< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > firstwd< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > buf< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > WordAddress< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > buf< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > lastchar< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > while< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > < = < / span > < span class = "identifier-syntax" > num_words< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > WordAddress< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > ~= < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > There's whitespace between the previous word and this one.< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Whitespace is okay around an asterisk...< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > lastchar< / span > < span class = "plain-syntax" > ~= < / span > < span class = "character-syntax" > '*'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'x'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'X'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > $D7< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > & & (< / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > -> 0 ~= < / span > < span class = "character-syntax" > '*'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'x'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'X'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > $D7< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > But around any other character, it's not.< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Don't include the new word.< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > WordLength< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > =0 : < / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > < < / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > : < / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > ++) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ch< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > -> < / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (~~((< / span > < span class = "identifier-syntax" > ch< / span > < span class = "plain-syntax" > > = < / span > < span class = "character-syntax" > '0'< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > ch< / span > < span class = "plain-syntax" > < = < / span > < span class = "character-syntax" > '9'< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > || (< / span > < span class = "identifier-syntax" > ch< / span > < span class = "plain-syntax" > == < / span > < span class = "character-syntax" > '-'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '+'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'E'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'e'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '.'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'x'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > 'X'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "character-syntax" > '*'< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > $D7< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > or< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > $5E< / span > < span class = "plain-syntax" > )))< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ix< / span > < span class = "plain-syntax" > < < / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > This word contains an invalid character.< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Don't include the new word.< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Okay, include it.< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > newstart< / span > < span class = "plain-syntax" > + < / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > lastchar< / span > < span class = "plain-syntax" > = (< / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > -1)-> 0;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > lastwasdot< / span > < span class = "plain-syntax" > = (< / span > < span class = "identifier-syntax" > newlen< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > lastchar< / span > < span class = "plain-syntax" > == < / span > < span class = "character-syntax" > '.'< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > > < / span > < span class = "identifier-syntax" > firstwd< / span > < span class = "plain-syntax" > & & < / span > < span class = "identifier-syntax" > lastwasdot< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Exclude a trailing period.< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > --;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > --;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > firstwd< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > No words accepted.< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FloatParse< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > buf< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > bufend< / span > < span class = "plain-syntax" > -< / span > < span class = "identifier-syntax" > buf< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > true< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > parsed_number< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FLOAT_NAN< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_FAIL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > GPR_NUMBER< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > ];< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > Endif< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > TARGET_GLULX< / span >
2020-01-10 01:10:09 +02:00
< / pre >
2020-05-03 03:01:21 +03:00
< nav role = "progress" > < div class = "progresscontainer" >
< ul class = "progressbar" > < li class = "progressprev" > < a href = "S-prs.html" > ❮ < / a > < / li > < li class = "progresssection" > < a href = "S-prs.html" > prs< / a > < / li > < li class = "progresscurrent" > tkn< / li > < li class = "progressnextoff" > ❯ < / li > < / ul > < / div >
< / nav > <!-- End of weave -->
2020-04-14 19:56:54 +03:00
2020-03-19 02:11:25 +02:00
< / main >
2020-01-10 01:10:09 +02:00
< / body >
< / html >