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 >
2020-04-14 19:56:54 +03:00
< title > Preform< / 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" >
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-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 >
2020-05-13 01:33:17 +03:00
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
< / script >
2019-03-17 14:40:57 +02:00
2020-05-13 01:33:17 +03:00
< link href = "../docs-assets/Popups.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< 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 >
2019-03-17 14:40:57 +02:00
2020-05-13 01:33:17 +03:00
< link href = "../docs-assets/Colours.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-05-19 18:36:50 +03:00
< link href = "../docs-assets/Preform-Colours.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-05-13 01:33:17 +03:00
< / head >
< body class = "commentary-font" >
< nav role = "navigation" >
2022-04-28 19:37:28 +03:00
< h1 > < a href = "../index.html" >
2020-05-13 01:33:17 +03:00
< img src = "../docs-assets/Inform.png" height = 72" >
< / a > < / h1 >
2022-04-28 19:37:28 +03:00
< ul > < li > < a href = "../index.html" > home< / a > < / li >
2022-04-04 20:31:44 +03:00
< / 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 >
2022-04-15 01:14:14 +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-04-28 19:20:06 +03:00
< li > < a href = "../../../inweb/index.html" > inweb< / a > < / li >
< li > < a href = "../../../intest/index.html" > intest< / a > < / li >
2019-03-17 14:40:57 +02:00
2020-05-13 01:33:17 +03:00
< / ul >
< / nav >
< main role = "main" >
<!-- Weave of 'Preform' generated by Inweb -->
< div class = "breadcrumbs" >
2022-04-28 19:37:28 +03:00
< ul class = "crumbs" > < li > < a href = "../index.html" > Home< / a > < / li > < li > < a href = "../services.html" > Services< / a > < / li > < li > < a href = "index.html" > words< / a > < / li > < li > < a href = "index.html#4" > Chapter 4: Parsing< / a > < / li > < li > < b > Preform< / b > < / li > < / ul > < / div >
2020-05-13 01:33:17 +03:00
< p class = "purpose" > To parse the word stream against a general grammar defined by Preform.< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< ul class = "toc" > < li > < a href = "4-prf.html#SP1" > § 1. Top level< / a > < / li > < li > < a href = "4-prf.html#SP1_3_2_1" > § 1.3.2.1. Middle level< / a > < / li > < li > < a href = "4-prf.html#SP1_3_2_1_4_4" > § 1.3.2.1.4.4. Bottom level< / a > < / li > < / ul > < hr class = "tocbar" >
2019-03-17 14:40:57 +02:00
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1" class = "paragraph-anchor" > < / a > < b > § 1. Top level. < / b > The purpose of this section is to write < a href = "4-prf.html#SP1" class = "internal" > Preform::parse_nt_against_word_range< / a > ,
2020-05-19 18:36:50 +03:00
the function which is called whenever Preform grammar is matched against a
2022-04-28 19:20:06 +03:00
wording: the < a href = "../../../inweb/index.html" class = "internal" > inweb< / a > preprocessor converts code like:
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "function-syntax" > < aquarium-name> < / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )) ...< / span >
< / pre >
< p class = "commentary" > into
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > Preform< / span > < span class = "plain-syntax" > ::< / span > < span class = "identifier-syntax" > parse_nt_against_word_range< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > aquarium_name_NTM< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > )) ...< / span >
< / pre >
< p class = "commentary" > Those last two parameters, < span class = "extract" > < span class = "extract-syntax" > result< / span > < / span > and < span class = "extract" > < span class = "extract-syntax" > result_p< / span > < / span > , are set only when we are
recursively calling the function from inside itself. Recall that a match against
a NT either succeeds or fails, and that produces the return value of this
function, < span class = "extract" > < span class = "extract-syntax" > TRUE< / span > < / span > or < span class = "extract" > < span class = "extract-syntax" > FALSE< / span > < / span > ; but if it succeeds it also produces both an integer
and a pointer result, though in any given situation either or both may be
irrelevant. When < span class = "extract" > < span class = "extract-syntax" > result< / span > < / span > and < span class = "extract" > < span class = "extract-syntax" > result_p< / span > < / span > are set, those results are copied
into the variables these pointers point to. In all cases, they are also
written to the global variables < span class = "extract" > < span class = "extract-syntax" > most_recent_result< / span > < / span > and < span class = "extract" > < span class = "extract-syntax" > most_recent_result_p< / span > < / span > .
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > in this mode, we trace parsing to the debugging log< / span >
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > preform_lookahead_mode< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > in this mode, we are looking ahead< / span >
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > fail_nonterminal_quantum< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > jump forward by this many words in lookahead< / span >
< span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > preform_backtrack< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > position to backtrack from in voracious internal< / span >
2020-05-19 18:36:50 +03:00
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < button class = "popup" onclick = "togglePopup('usagePopup1')" > < span class = "comment-syntax" > ?< / span > < span class = "popuptext" id = "usagePopup1" > Usage of < span class = "code-font" > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < / span > :< br / > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_5" > § 1.3.2.1.4.4.2.3.1.5< / a > , < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3_1" > § 1.3.2.1.4.4.2.3.1.3.1< / a > , < a href = "4-prf.html#SP2" > § 2< / a > < / span > < / button > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > nonterminal< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > wording< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > result< / span > < span class = "plain-syntax" > ,< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > **< / span > < span class = "identifier-syntax" > result_p< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > time_t< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > start_of_nt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > time< / span > < span class = "plain-syntax" > (0);< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > internal_error< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "can't parse a null nonterminal"< / span > < span class = "plain-syntax" > );< / span >
2020-05-17 15:37:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ins< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nonterminal_tries< / span > < span class = "plain-syntax" > ++;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > success_rval< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > what to return in the event of a successful match< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > fail_nonterminal_quantum< / 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" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > teppic< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > Teppic saves Ptraci< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Trace watched nonterminals, but not in lookahead mode< / span > < span class = "named-paragraph-number" > 1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > input_length< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::length< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-19 13:46:13 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "identifier-syntax" > max_words< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) ||< / span >
< span class = "plain-syntax" > (< / span > < a href = "4-le.html#SP5" class = "function-link" > < span class = "function-syntax" > LengthExtremes::in_bounds< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > input_length< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > )))< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3" class = "named-paragraph-link" > < span class = "named-paragraph" > Try to match the input text to the nonterminal< / span > < span class = "named-paragraph-number" > 1.3< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > The nonterminal has failed to parse< / span > < span class = "named-paragraph-number" > 1.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
2019-03-17 14:40:57 +02:00
< / pre >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_1" class = "paragraph-anchor" > < / a > < b > § 1.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Trace watched nonterminals, but not in lookahead mode< / span > < span class = "named-paragraph-number" > 1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ins< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > watched< / 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" > ptraci< / 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" > preform_lookahead_mode< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / 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" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "%V: < %W> \n"< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1" > § 1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_2" class = "paragraph-anchor" > < / a > < b > § 1.2. < / b > The function ends here...
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > The nonterminal has failed to parse< / span > < span class = "named-paragraph-number" > 1.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-18 01:10:11 +03:00
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP3" class = "function-link" > < span class = "function-syntax" > Instrumentation::note_nonterminal_fail< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "Failed %V (time %d)\n"< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > time< / span > < span class = "plain-syntax" > (0)-< / span > < span class = "identifier-syntax" > start_of_nt< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > teppic< / 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" > FALSE< / span > < span class = "plain-syntax" > ;< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1" > § 1< / a > , < a href = "4-prf.html#SP1_3_2_1_4_1" > § 1.3.2.1.4.1< / a > .< / li > < / ul >
2022-05-16 18:50:03 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_1_1" class = "paragraph-anchor" > < / a > < b > § 1.3.1.1. < / b > ...unless a match was made, in which case it ends here. At this point < span class = "extract" > < span class = "extract-syntax" > Q< / span > < / span >
2020-05-03 03:01:21 +03:00
and < span class = "extract" > < span class = "extract-syntax" > QP< / span > < / span > will hold the results of the match.
< / p >
2019-03-17 14:40:57 +02:00
2022-05-16 18:50:03 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > The nonterminal has successfully parsed< / span > < span class = "named-paragraph-number" > 1.3.1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2019-03-17 14:40:57 +02:00
< / p >
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-18 01:10:11 +03:00
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP3" class = "function-link" > < span class = "function-syntax" > Instrumentation::note_nonterminal_match< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > result< / span > < span class = "plain-syntax" > ) *< / span > < span class = "identifier-syntax" > result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > result_p< / span > < span class = "plain-syntax" > ) *< / span > < span class = "identifier-syntax" > result_p< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > most_recent_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > most_recent_result_p< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > teppic< / 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" > success_rval< / span > < span class = "plain-syntax" > ;< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_1" > § 1.3.1< / a > , < a href = "4-prf.html#SP1_3_2" > § 1.3.2< / a > , < a href = "4-prf.html#SP1_3_2_1_4" > § 1.3.2.1.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3" class = "paragraph-anchor" > < / a > < b > § 1.3. < / b > Here we see that a successful voracious NT returns the word number it got
2020-05-03 03:01:21 +03:00
to, rather than < span class = "extract" > < span class = "extract-syntax" > TRUE< / span > < / span > . Otherwise this is straightforward: we delegate to
2020-05-19 18:36:50 +03:00
an internal NT, or try all possible productions for a regular one.
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "definitions code-font" > < span class = "definition-keyword" > define< / span > < span class = "constant-syntax" > RANGE_OPTIMISATION_LENGTH< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 10< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try to match the input text to the nonterminal< / span > < span class = "named-paragraph-number" > 1.3< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > unoptimised< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < a href = "3-wrd.html#SP11" class = "function-link" > < span class = "function-syntax" > Wordings::empty< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )) || (< / span > < span class = "identifier-syntax" > input_length< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > RANGE_OPTIMISATION_LENGTH< / span > < span class = "plain-syntax" > ))< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > unoptimised< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > voracious< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > unoptimised< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-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" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > internal_definition< / span > < span class = "plain-syntax" > ) < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Try to match to an internal NT< / span > < span class = "named-paragraph-number" > 1.3.1< / span > < / a > < / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Try to match to a regular NT< / span > < span class = "named-paragraph-number" > 1.3.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1" > § 1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_1" class = "paragraph-anchor" > < / a > < b > § 1.3.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try to match to an internal NT< / span > < span class = "named-paragraph-number" > 1.3.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > unoptimised< / span > < span class = "plain-syntax" > ) || (< / span > < a href = "4-ni.html#SP8" class = "function-link" > < span class = "function-syntax" > NTI::nt_bitmap_violates< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , & (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_ntic< / span > < span class = "plain-syntax" > )) == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ) > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > = (*(< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > internal_definition< / span > < span class = "plain-syntax" > ))(< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , & < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > , & < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > );< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > { < / span > < span class = "identifier-syntax" > r< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > Q< / 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" > r< / 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" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > voracious< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > success_rval< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > r< / 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" > ptraci< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "Succeeded %d\n"< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > time< / span > < span class = "plain-syntax" > (0)-< / span > < span class = "identifier-syntax" > start_of_nt< / span > < span class = "plain-syntax" > );< / span >
2022-05-16 18:50:03 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > The nonterminal has successfully parsed< / span > < span class = "named-paragraph-number" > 1.3.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
2022-05-16 18:50:03 +03:00
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Log an NTIC violation< / span > < span class = "named-paragraph-number" > 1.3.1.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3" > § 1.3< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try to match to a regular NT< / span > < span class = "named-paragraph-number" > 1.3.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > unoptimised< / span > < span class = "plain-syntax" > ) || (< / span > < a href = "4-ni.html#SP8" class = "function-link" > < span class = "function-syntax" > NTI::nt_bitmap_violates< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , & (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_ntic< / span > < span class = "plain-syntax" > )) == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > acc_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > production_list< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > first_pl< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pl< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "constant-syntax" > NATURAL_LANGUAGE_WORDS_TYPE< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > nl< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > definition_language< / 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" > primary_Preform_language< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ) || (< / span > < span class = "identifier-syntax" > primary_Preform_language< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > nl< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ditto_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ;< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > production< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pl< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > first_pr< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pr< / span > < span class = "plain-syntax" > )< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Try to match to a production< / span > < span class = "named-paragraph-number" > 1.3.2.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > multiplicitous< / span > < span class = "plain-syntax" > ) & & (< / span > < span class = "identifier-syntax" > acc_result< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > acc_result< / span > < span class = "plain-syntax" > ;< / span >
2022-05-16 18:50:03 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > The nonterminal has successfully parsed< / span > < span class = "named-paragraph-number" > 1.3.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > }< / span >
2022-05-16 18:50:03 +03:00
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Log an NTIC violation< / span > < span class = "named-paragraph-number" > 1.3.1.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3" > § 1.3< / a > .< / li > < / ul >
2022-05-16 18:50:03 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_1_2" class = "paragraph-anchor" > < / a > < b > § 1.3.1.2. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log an NTIC violation< / span > < span class = "named-paragraph-number" > 1.3.1.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "%V: < %W> violates "< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP9" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_ntic< / span > < / a > < span class = "plain-syntax" > (& (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_ntic< / span > < span class = "plain-syntax" > ));< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "\n"< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_1" > § 1.3.1< / a > , < a href = "4-prf.html#SP1_3_2" > § 1.3.2< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1. Middle level. < / b > So from here on down we look only at the regular case, where we're parsing the
2020-05-19 18:36:50 +03:00
text against a production. Recall that a production's NTIC has the "ditto flag"
2022-05-03 00:59:04 +03:00
if it is the same constraint as the previous production's NTIC; in which
2020-05-19 18:36:50 +03:00
case we have no need to recompute < span class = "extract" > < span class = "extract-syntax" > violates< / span > < / span > .
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try to match to a production< / span > < span class = "named-paragraph-number" > 1.3.2.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > violates< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / 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" > unoptimised< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / 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" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > pr_ntic< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > ditto_flag< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > violates< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > ditto_result< / 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" > violates< / span > < span class = "plain-syntax" > = < / span > < a href = "4-ni.html#SP8" class = "function-link" > < span class = "function-syntax" > NTI::nt_bitmap_violates< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , & (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > pr_ntic< / span > < span class = "plain-syntax" > ));< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > ditto_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > violates< / span > < span class = "plain-syntax" > ;< / span >
2020-05-09 15:07:39 +03:00
< span class = "plain-syntax" > }< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > violates< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "4-le.html#SP5" class = "function-link" > < span class = "function-syntax" > LengthExtremes::in_bounds< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > input_length< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > pr_extremes< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Log that the production is entering full parsing< / span > < span class = "named-paragraph-number" > 1.3.2.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4" class = "named-paragraph-link" > < span class = "named-paragraph" > Enter full parsing of production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Log a production length violation< / span > < span class = "named-paragraph-number" > 1.3.2.1.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_3" class = "named-paragraph-link" > < span class = "named-paragraph" > Log a production NTIC violation< / span > < span class = "named-paragraph-number" > 1.3.2.1.3< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2" > § 1.3.2< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log that the production is entering full parsing< / span > < span class = "named-paragraph-number" > 1.3.2.1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
2020-05-09 15:07:39 +03:00
2020-05-19 18:36:50 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-09 15:07:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG_INDENT< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Log the production match number< / span > < span class = "named-paragraph-number" > 1.3.2.1.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP11" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_production< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ); < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "\n"< / span > < span class = "plain-syntax" > );< / span >
2020-05-09 15:07:39 +03:00
< span class = "plain-syntax" > }< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1" > § 1.3.2.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.2. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log a production length violation< / span > < span class = "named-paragraph-number" > 1.3.2.1.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "production in %V: "< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP11" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_production< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > ": < %W> violates length "< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP9" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_extremes< / span > < / a > < span class = "plain-syntax" > (& (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > pr_extremes< / span > < span class = "plain-syntax" > ));< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "\n"< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1" > § 1.3.2.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_3" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.3. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log a production NTIC violation< / span > < span class = "named-paragraph-number" > 1.3.2.1.3< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "production in %V: "< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP11" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_production< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > ": < %W> violates "< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP9" class = "function-link" > < span class = "function-syntax" > Instrumentation::log_ntic< / span > < / a > < span class = "plain-syntax" > (& (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > pr_ntic< / span > < span class = "plain-syntax" > ));< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "\n"< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > }< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1" > § 1.3.2.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4. < / b > < / p >
2020-05-03 03:01:21 +03:00
2020-05-17 13:51:27 +03:00
< pre class = "definitions code-font" > < span class = "definition-keyword" > define< / span > < span class = "constant-syntax" > MAX_RESULTS_PER_PRODUCTION< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 10< / span >
< span class = "definition-keyword" > define< / span > < span class = "constant-syntax" > MAX_PTOKENS_PER_PRODUCTION< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > 32< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Enter full parsing of production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > checked< / span > < span class = "plain-syntax" > [< / span > < span class = "constant-syntax" > MAX_PTOKENS_PER_PRODUCTION< / span > < span class = "plain-syntax" > ];< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > intermediates< / span > < span class = "plain-syntax" > [< / span > < span class = "constant-syntax" > MAX_RESULTS_PER_PRODUCTION< / span > < span class = "plain-syntax" > ];< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > intermediate_ps< / span > < span class = "plain-syntax" > [< / span > < span class = "constant-syntax" > MAX_RESULTS_PER_PRODUCTION< / span > < span class = "plain-syntax" > ];< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > parsed_open_pos< / span > < span class = "plain-syntax" > = -1, < / span > < span class = "identifier-syntax" > parsed_close_pos< / span > < span class = "plain-syntax" > = -1;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > ifdef< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > CORE_MODULE< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > parse_node< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > added_to_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > endif< / span >
2020-05-03 03:01:21 +03:00
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4" class = "named-paragraph-link" > < span class = "named-paragraph" > Actually parse the given production, going to Fail if we can't< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "comment-syntax" > Succeed:< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Compose and store the result< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP6" class = "function-link" > < span class = "function-syntax" > Instrumentation::note_production_match< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Log the success of the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2022-05-16 18:50:03 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > The nonterminal has successfully parsed< / span > < span class = "named-paragraph-number" > 1.3.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail:< / span >
< span class = "plain-syntax" > < / span > < a href = "4-ins.html#SP6" class = "function-link" > < span class = "function-syntax" > Instrumentation::note_production_fail< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_3" class = "named-paragraph-link" > < span class = "named-paragraph" > Log the failure of the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.3< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1" > § 1.3.2.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.1. < / b > Once we have successfully matched the line, we need to compose the
2022-04-28 19:20:06 +03:00
intermediate results into a final result. If < a href = "../../../inweb/index.html" class = "internal" > inweb< / a > has compiled a compositor
2020-05-19 18:36:50 +03:00
function for the nonterminal, we call it.
2020-05-03 03:01:21 +03:00
< / p >
< p class = "commentary" > If there's no compositor then the integer result is the production's number,
and the pointer result is null.
< / p >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > This is the range of fail nonterminal values — < span class = "extract" > < span class = "extract-syntax" > FAIL_NONTERMINAL< / span > < / span > to one
less than < span class = "extract" > < span class = "extract-syntax" > FAIL_NONTERMINAL_TO< / span > < / span > :
< / p >
2020-05-03 03:01:21 +03:00
< pre class = "definitions code-font" > < span class = "definition-keyword" > define< / span > < span class = "constant-syntax" > FAIL_NONTERMINAL< / span > < span class = "plain-syntax" > -100000< / span >
< span class = "definition-keyword" > define< / span > < span class = "constant-syntax" > FAIL_NONTERMINAL_TO< / span > < span class = "plain-syntax" > < / span > < span class = "constant-syntax" > FAIL_NONTERMINAL< / span > < span class = "plain-syntax" > +1000< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Compose and store the result< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-17 13:51:27 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > compositor_fn< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > intermediates< / span > < span class = "plain-syntax" > [0] = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > f< / span > < span class = "plain-syntax" > = (*(< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > compositor_fn< / span > < span class = "plain-syntax" > ))(& < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > , & < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > intermediates< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > intermediate_ps< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_result< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > f< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > 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" > f< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > FAIL_NONTERMINAL< / span > < span class = "plain-syntax" > ) & & (< / span > < span class = "identifier-syntax" > f< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > FAIL_NONTERMINAL_TO< / span > < span class = "plain-syntax" > )) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > fail_nonterminal_quantum< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > f< / span > < span class = "plain-syntax" > - < / span > < span class = "constant-syntax" > FAIL_NONTERMINAL< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > The nonterminal has failed to parse< / span > < span class = "named-paragraph-number" > 1.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > multiplicitous< / span > < span class = "plain-syntax" > ) < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Handle multiplicitous nonterminals directly< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4" > § 1.3.2.1.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_1_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.1.1. < / b > Multiplicitous NTs exist only in < a href = "../core-module/index.html" class = "internal" > core< / a > , and differ from other regular NTs
2020-05-19 18:36:50 +03:00
because they accumulate their results from successful productions but do not
stop parsing on a successful match.
< / p >
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Handle multiplicitous nonterminals directly< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
< / p >
< 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" > CORE_MODULE< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > added_to_result< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > acc_result< / span > < span class = "plain-syntax" > = (< / span > < span class = "reserved-syntax" > void< / span > < span class = "plain-syntax" > *) < / span > < span class = "identifier-syntax" > SyntaxTree::add_reading< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > parse_node< / span > < span class = "plain-syntax" > *) < / span > < span class = "identifier-syntax" > acc_result< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > QP< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > endif< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ;< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_1" > § 1.3.2.1.4.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.2. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log the success of the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Log the production match number< / span > < span class = "named-paragraph-number" > 1.3.2.1.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "succeeded (%s): "< / span > < span class = "plain-syntax" > , (< / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > )?< / span > < span class = "string-syntax" > "slowly"< / span > < span class = "plain-syntax" > :< / span > < span class = "string-syntax" > "quickly"< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "result: %d\n"< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > Q< / span > < span class = "plain-syntax" > ); < / span > < span class = "identifier-syntax" > LOG_OUTDENT< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4" > § 1.3.2.1.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_3" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.3. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log the failure of the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.3< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > ptraci< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Log the production match number< / span > < span class = "named-paragraph-number" > 1.3.2.1.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > #< / span > < span class = "identifier-syntax" > ifdef< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > CORE_MODULE< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > added_to_result< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "added to result (%s): $P\n"< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > )?< / span > < span class = "string-syntax" > "slowly"< / span > < span class = "plain-syntax" > :< / span > < span class = "string-syntax" > "quickly"< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > added_to_result< / 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" > endif< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "failed (%s)\n"< / span > < span class = "plain-syntax" > , (< / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > )?< / span > < span class = "string-syntax" > "slowly"< / span > < span class = "plain-syntax" > :< / span > < span class = "string-syntax" > "quickly"< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG_OUTDENT< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4" > § 1.3.2.1.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_1_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.1.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Log the production match number< / span > < span class = "named-paragraph-number" > 1.3.2.1.1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 26< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "production /%c%c/: "< / span > < span class = "plain-syntax" > , < / span > < span class = "character-syntax" > 'a'< / span > < span class = "plain-syntax" > +< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > -26, < / span > < span class = "character-syntax" > 'a'< / span > < span class = "plain-syntax" > +< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > -26);< / span >
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "production /%c/: "< / span > < span class = "plain-syntax" > , < / span > < span class = "character-syntax" > 'a'< / span > < span class = "plain-syntax" > +< / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > match_number< / span > < span class = "plain-syntax" > );< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_1" > § 1.3.2.1.1< / a > , < a href = "4-prf.html#SP1_3_2_1_4_2" > § 1.3.2.1.4.2< / a > , < a href = "4-prf.html#SP1_3_2_1_4_3" > § 1.3.2.1.4.3< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4. Bottom level. < / b > Okay: so now we have exhausted all the optimisations avoiding the need to
2020-05-19 18:36:50 +03:00
parse our text against the production, so we are forced to do some work.
The strategy is:
< / p >
< ul class = "items" > < li > ● first, a fast scan checking the easy things;
< / li > < li > ● then a slow scan checking the rest;
< / li > < li > ● then making sure brackets match, if there were any.
< / li > < / ul >
< p class = "commentary" > For example, if the production is
< / p >
< pre class = "Preform-displayed-code all-displayed-code code-font" >
< span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > adjust< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > the< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-function-syntax" > < achingly-slow> < / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > to< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > the< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-function-syntax" > < exhaustive> < / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > at< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > once< / span >
< / pre >
< p class = "commentary" > then the fast scan verifies the presence of "adjust the" and "at once";
the slow scan next looks for all occurrences of "to the", the single strut
for this production; and only then does it test the two slow nonterminals
on the intervening words, if there are any.
< / p >
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Actually parse the given production, going to Fail if we can't< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4< / span > < / span > < span class = "Preform-comment-syntax" > =< / span >
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Try a fast scan through the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.1< / span > < / a > < / 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" > slow_scan_needed< / span > < span class = "plain-syntax" > ) < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Try a slow scan through the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2< / span > < / a > < / 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_open_pos< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) & & (< / span > < span class = "identifier-syntax" > parsed_close_pos< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ))< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "3-wrd.html#SP17" class = "function-link" > < span class = "function-syntax" > Wordings::paired_brackets< / span > < / a > < span class = "plain-syntax" > (< / span >
< span class = "plain-syntax" > < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > parsed_open_pos< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > parsed_close_pos< / span > < span class = "plain-syntax" > )) == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > )< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ;< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4" > § 1.3.2.1.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.1. < / b > In the fast scan, we check that all fixed words with known positions
2020-05-03 03:01:21 +03:00
are in those positions.
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try a fast scan through the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = -1, < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ;< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > first_pt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pt< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > ++) {< / span >
2020-05-17 15:37:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > ptoken_is_fast< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > ptoken_position< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )+< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > -1;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )+< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > +1;< / span >
2020-05-13 01:33:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "4-prf.html#SP3" class = "function-link" > < span class = "function-syntax" > Preform::parse_fixed_word_ptoken< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > the word should have been here, and it wasn't< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ve_pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > OPENBRACKET_V< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > parsed_open_pos< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ve_pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > CLOSEBRACKET_V< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > parsed_close_pos< / 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" > checked< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > tc< / 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" > else< / span > < span class = "plain-syntax" > {< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > checked< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > ] = -1;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > slow_scan_needed< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) & & (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > != < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )))< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > text goes on further< / span >
2019-03-17 14:40:57 +02:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4" > § 1.3.2.1.4.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2. < / b > The slow scan is more challenging. We want to loop through all possible
2020-05-03 03:01:21 +03:00
strut positions, where by "possible" we mean that
2020-05-19 18:36:50 +03:00
$$ s_i+\ell_i \leq s_{i+1}, \quad i = 0, 1, ..., s $$
2020-05-03 03:01:21 +03:00
and that for each \(i\) the \(i\)-th strut matches the text beginning at \(s_i\).
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try a slow scan through the production< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "constant-syntax" > MAX_STRUTS_PER_PRODUCTION< / span > < span class = "plain-syntax" > ]; < / span > < span class = "comment-syntax" > word numbers for where we try the struts< / span >
2020-05-17 15:37:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > no_struts< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Start from the lexicographically earliest strut position< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > backtrack_token< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > backtrack_index< / span > < span class = "plain-syntax" > = -1, < / span > < span class = "identifier-syntax" > backtrack_to< / span > < span class = "plain-syntax" > = -1, < / span > < span class = "identifier-syntax" > backtrack_tc< / span > < span class = "plain-syntax" > = -1;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > while< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3" class = "named-paragraph-link" > < span class = "named-paragraph" > Try a slow scan with the current strut positions< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition:< / 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" > backtrack_token< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > continue< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Move on to the next strut position< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.2< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4" > § 1.3.2.1.4.4< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.1. < / b > We start by finding the lexicographically earliest, i.e., we find the earliest
2020-05-03 03:01:21 +03:00
possible position for \(s_0\), then the earliest position from \(s_0+\ell_0\) for
\(s_1\), and so on. (Our wildcards are not greedy: we match with shortest possible
text rather than longest.)
< / p >
< p class = "commentary" > In all of the code below, the general case with < span class = "extract" > < span class = "extract-syntax" > NS< / span > < / span > greater than 1 is actually
valid code for all cases, but experiment shows about a 5\% speed gain from
handling the popular case of one strut separately.
< / p >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Start from the lexicographically earliest strut position< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [0] = < / span > < a href = "4-prf.html#SP2" class = "function-link" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > struts< / span > < span class = "plain-syntax" > [0], < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [0], < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ));< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [0] == -1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / 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" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ) {< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > =0; < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > < < / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ++) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] = < / span > < a href = "4-prf.html#SP2" class = "function-link" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > struts< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] == -1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ;< / span >
2023-09-11 01:46:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] + < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] + < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2" > § 1.3.2.1.4.4.2< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.2. < / b > In the general case, we move the final strut forward if we can; if we can't,
2020-05-03 03:01:21 +03:00
we move the penultimate one, then move the final one to the first subsequent
position valid for it; and so on. Ultimately this results in the first strut
being unable to move forwards, at which point, we've lost.
2019-03-17 14:40:57 +02:00
< / p >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Move on to the next strut position< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / 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" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [0] = < / span > < a href = "4-prf.html#SP2" class = "function-link" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > struts< / span > < span class = "plain-syntax" > [0], < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [0], < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [0]+1);< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [0] == -1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / 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" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > s< / 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" > s< / span > < span class = "plain-syntax" > =< / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > -1; < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > > =0; < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > --) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > n< / span > < span class = "plain-syntax" > = < / span > < a href = "4-prf.html#SP2" class = "function-link" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > struts< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ]+1);< / span >
2020-05-03 03:01:21 +03:00
< 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" > != -1) { < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] = < / span > < span class = "identifier-syntax" > n< / 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" > s< / span > < span class = "plain-syntax" > == -1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] + < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > s< / 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" > s< / span > < span class = "plain-syntax" > < < / span > < span class = "identifier-syntax" > NS< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ++) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] = < / span > < a href = "4-prf.html#SP2" class = "function-link" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ,< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > struts< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] == -1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ;< / span >
2023-09-11 01:46:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] + < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_lengths< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > s< / span > < span class = "plain-syntax" > ] + < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2" > § 1.3.2.1.4.4.2< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3. < / b > We can now forget about struts, thankfully, and check the remaining unchecked
2020-05-03 03:01:21 +03:00
ptokens.
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Try a slow scan with the current strut positions< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ), < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > , *< / span > < span class = "identifier-syntax" > nextpt< / 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" > backtrack_token< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > backtrack_token< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > nextpt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > backtrack_token< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pt< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > backtrack_tc< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > backtrack_to< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Reenter< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pr< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > first_pt< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nextpt< / span > < span class = "plain-syntax" > = (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > )?(< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pt< / span > < span class = "plain-syntax" > ):< / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ;< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > nextpt< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > nextpt< / span > < span class = "plain-syntax" > = (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > )?(< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pt< / span > < span class = "plain-syntax" > ):< / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > tc< / span > < span class = "plain-syntax" > ++) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Reenter:< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > known_pos< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > checked< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > tc< / 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" > known_pos< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-19 18:36:50 +03:00
< 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" > known_pos< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > Fail< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > a theoretical possibility if strut lookahead overreaches< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > known_pos< / span > < span class = "plain-syntax" > +1;< / span >
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_starts< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > )< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_result< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_starts< / span > < span class = "plain-syntax" > ] = < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::one_word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_ends< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > )< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_result< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_ends< / span > < span class = "plain-syntax" > ] =< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < a href = "3-wrd.html#SP6" class = "function-link" > < span class = "function-syntax" > Wordings::up_to< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > nt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_result< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > range_ends< / span > < span class = "plain-syntax" > ], < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > -1);< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > }< / span >
2020-08-09 20:39:31 +03:00
< 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 > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )+1) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2" > § 1.3.2.1.4.4.2< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-19 18:36:50 +03:00
< / p >
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > switch< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ptoken_category< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > case< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FIXED_WORD_PTC:< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a fixed word ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.1< / span > < / a > < / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > case< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > SINGLE_WILDCARD_PTC:< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_2" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a single wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.2< / span > < / a > < / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > case< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > MULTIPLE_WILDCARD_PTC:< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a multiple wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3< / span > < / a > < / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > case< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > POSSIBLY_EMPTY_WILDCARD_PTC:< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_4" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a possibly empty wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.4< / span > < / a > < / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > case< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > NONTERMINAL_PTC:< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_5" class = "named-paragraph-link" > < span class = "named-paragraph" > Match a nonterminal ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.5< / span > < / a > < / span > < span class = "plain-syntax" > ; < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3" > § 1.3.2.1.4.4.2.3< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.1. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a fixed word ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.1< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-13 01:33:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < a href = "4-prf.html#SP3" class = "function-link" > < span class = "function-syntax" > Preform::parse_fixed_word_ptoken< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ve_pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > OPENBRACKET_V< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > parsed_open_pos< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ve_pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > CLOSEBRACKET_V< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > parsed_close_pos< / 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" > wn< / span > < span class = "plain-syntax" > ++;< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" > § 1.3.2.1.4.4.2.3.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_2" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.2. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a single wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.2< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
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" > wn< / span > < span class = "plain-syntax" > ++;< / span >
2019-03-17 14:40:57 +02:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" > § 1.3.2.1.4.4.2.3.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_3" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.3. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a multiple wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-08-09 20:39:31 +03:00
< 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 > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Calculate how much to stretch this elastic ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< 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" > wt< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ; < / span > < span class = "comment-syntax" > zero length< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > balanced_wildcard< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > bl< / 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" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > =< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > < =< / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > ++) {< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < a href = "3-lxr.html#SP19" class = "function-link" > < span class = "function-syntax" > Lexer::word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > OPENBRACKET_V< / span > < span class = "plain-syntax" > ) || (< / span > < a href = "3-lxr.html#SP19" class = "function-link" > < span class = "function-syntax" > Lexer::word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > OPENBRACE_V< / span > < span class = "plain-syntax" > )) < / span > < span class = "identifier-syntax" > bl< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < a href = "3-lxr.html#SP19" class = "function-link" > < span class = "function-syntax" > Lexer::word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > CLOSEBRACKET_V< / span > < span class = "plain-syntax" > ) || (< / span > < a href = "3-lxr.html#SP19" class = "function-link" > < span class = "function-syntax" > Lexer::word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > i< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > CLOSEBRACE_V< / span > < span class = "plain-syntax" > )) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > bl< / 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" > bl< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-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" > bl< / span > < span class = "plain-syntax" > != < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ;< / 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" > wt< / span > < span class = "plain-syntax" > +1;< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" > § 1.3.2.1.4.4.2.3.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_4" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.4. < / b > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a possibly empty wildcard ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.4< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Calculate how much to stretch this elastic ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > +1;< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" > § 1.3.2.1.4.4.2.3.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_5" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.5. < / b > A voracious nonterminal is offered the entire rest of the word range, and
2020-05-03 03:01:21 +03:00
returns how much it ate. Otherwise, we offer the maximum amount of space
available: if, for word-count reasons, that's never going to match, then
2020-05-19 18:36:50 +03:00
we rely on the recursive call to < a href = "4-prf.html#SP1" class = "internal" > Preform::parse_nt_against_word_range< / a > returning a
2020-05-03 03:01:21 +03:00
quick no.
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Match a nonterminal ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.5< / span > < / span > < span class = "comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-08-09 20:39:31 +03:00
< 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 > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )) & & (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > min_words< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ))< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > voracious< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > min_words< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) & & < / span >
< span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > min_words< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "identifier-syntax" > max_words< / span > < span class = "plain-syntax" > ))< / span >
2023-09-11 01:46:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > + < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > min_words< / span > < span class = "plain-syntax" > - < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "named-paragraph-container code-font" > < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3_1" class = "named-paragraph-link" > < span class = "named-paragraph" > Calculate how much to stretch this elastic ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3.1< / span > < / a > < / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > backtrack_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" > ptraci< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "Reached backtrack position %V: < %W> \n"< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > , < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ));< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > preform_backtrack< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > intermediate_ps< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > result_index< / 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" > ptraci< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > LOG_INDENT< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < a href = "4-prf.html#SP1" class = "function-link" > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > , < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ),< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > & (< / span > < span class = "identifier-syntax" > intermediates< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > result_index< / span > < span class = "plain-syntax" > ]), & (< / span > < span class = "identifier-syntax" > intermediate_ps< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > result_index< / 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" > ptraci< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > LOG_OUTDENT< / 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" > pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > backtrack_token< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > preform_backtrack< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > backtrack_token< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > NULL< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > voracious< / 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" > q< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / 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" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) { < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = -< / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > backtrack_index< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > result_index< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > backtrack_to< / 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" > backtrack_token< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > backtrack_tc< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > tc< / 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" > ptraci< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > LOG< / span > < span class = "plain-syntax" > (< / span > < span class = "string-syntax" > "Set backtrack position %V: < %W> \n"< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nonterminal_id< / span > < span class = "plain-syntax" > , < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > ));< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > { < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > negated_ptoken< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > ?< / span > < span class = "identifier-syntax" > FALSE: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" > q< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 13:46:13 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "identifier-syntax" > max_words< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > +1;< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1" > § 1.3.2.1.4.4.2.3.1< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP1_3_2_1_4_4_2_3_1_3_1" class = "paragraph-anchor" > < / a > < b > § 1.3.2.1.4.4.2.3.1.3.1. < / b > How much text from the input should this ptoken match? We feed it as much
2020-05-03 03:01:21 +03:00
as possible, and to calculate that, we must either be at the end of the run,
or else know exactly where the next ptoken starts: because its position is
known, or because it's a strut.
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< p class = "commentary" > This is why two elastic nonterminals in a row won't parse correctly:
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< pre class = "Preform-displayed-code all-displayed-code code-font" >
< span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > frog< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-function-syntax" > < amphibian> < / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-function-syntax" > < pond-preference> < / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > toad< / span >
2020-05-03 03:01:21 +03:00
< / pre >
< p class = "commentary" > Preform is unable to work out where the central boundary will occur. In theory
it should try every possibility. But that's inefficient: in practice the
solution is to write the grammar to minimise these cases, and then to set up
< amphibian> as a voracious token, so that it decides the boundary position
for itself. (If < amphibian> is not voracious, the following calculation
probably gives the wrong answer.)
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< p class = "commentary" > < span class = "named-paragraph-container code-font" > < span class = "named-paragraph-defn" > Calculate how much to stretch this elastic ptoken< / span > < span class = "named-paragraph-number" > 1.3.2.1.4.4.2.3.1.3.1< / span > < / span > < span class = "Preform-comment-syntax" > =< / span >
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > nextpt< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > {< / span >
2020-05-17 15:37:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > ptoken_position< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::first_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )+< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > -2;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )+< / span > < span class = "identifier-syntax" > p< / span > < span class = "plain-syntax" > ;< / span >
2020-05-17 15:37:39 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_number< / span > < span class = "plain-syntax" > > = < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > spos< / span > < span class = "plain-syntax" > [< / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > strut_number< / span > < span class = "plain-syntax" > ]-1;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > )< / span >
< span class = "plain-syntax" > & & (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > negated_ptoken< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > )< / span >
2020-05-19 13:46:13 +03:00
< span class = "plain-syntax" > & & (< / span > < a href = "4-to.html#SP9" class = "function-link" > < span class = "function-syntax" > Optimiser::ptoken_width< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ) == < / span > < span class = "constant-syntax" > PTOKEN_ELASTIC< / span > < span class = "plain-syntax" > )) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = -1;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > nonterminal< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > target< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > lookahead< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > save_preform_lookahead_mode< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > preform_lookahead_mode< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > preform_lookahead_mode< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > TRUE< / span > < span class = "plain-syntax" > ;< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > +1; < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > < = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ); < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > ++) {< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "4-prf.html#SP1" class = "function-link" > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > target< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > , < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > )), < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > )) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ) ||< / span >
2020-05-19 18:36:50 +03:00
< span class = "plain-syntax" > (< / span > < a href = "4-prf.html#SP1" class = "function-link" > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > -1), < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > ))) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > -1; < / 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" > else< / 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" > fail_nonterminal_quantum< / span > < span class = "plain-syntax" > > < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > j< / span > < span class = "plain-syntax" > += < / span > < span class = "identifier-syntax" > fail_nonterminal_quantum< / span > < span class = "plain-syntax" > - < / span > < span class = "constant-syntax" > 1< / 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" > preform_lookahead_mode< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > save_preform_lookahead_mode< / 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" > wt< / span > < span class = "plain-syntax" > < < / span > < span class = "constant-syntax" > 0< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > goto< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > FailThisStrutPosition< / 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" > wt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
2020-05-19 18:36:50 +03:00
< ul class = "endnotetexts" > < li > This code is used in < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_3" > § 1.3.2.1.4.4.2.3.1.3< / a > , < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_4" > § 1.3.2.1.4.4.2.3.1.4< / a > , < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_5" > § 1.3.2.1.4.4.2.3.1.5< / a > .< / li > < / ul >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP2" class = "paragraph-anchor" > < / a > < b > § 2. < / b > Here we find the next possible match position for the strut beginning < span class = "extract" > < span class = "extract-syntax" > start< / span > < / span >
2020-05-03 03:01:21 +03:00
and of width < span class = "extract" > < span class = "extract-syntax" > len< / span > < / span > in words, which begins at word < span class = "extract" > < span class = "extract-syntax" > from< / span > < / span > or after. Note that
the strut might run up right to the end of the input text: for example, in
< / p >
2019-03-17 14:40:57 +02:00
2020-05-19 18:36:50 +03:00
< pre class = "Preform-displayed-code all-displayed-code code-font" >
< span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > neckties< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-reserved-syntax" > ...< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > tied< / span > < span class = "Preform-plain-syntax" > < / span > < span class = "Preform-constant-syntax" > ***< / span >
2020-05-03 03:01:21 +03:00
< / pre >
2020-05-19 18:36:50 +03:00
< p class = "commentary" > the word "tied" is a strut, because the < span class = "extract" > < span class = "Preform-extract-syntax" > ***< / span > < / span > makes its position uncertain,
but since < span class = "extract" > < span class = "Preform-extract-syntax" > ***< / span > < / span > might match the empty text, "tied" might legally be the
2020-05-03 03:01:21 +03:00
last word in the input text.
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < button class = "popup" onclick = "togglePopup('usagePopup2')" > < span class = "comment-syntax" > ?< / span > < span class = "popuptext" id = "usagePopup2" > Usage of < span class = "code-font" > < span class = "function-syntax" > Preform::next_strut_posn_after< / span > < / span > :< br / > < a href = "4-prf.html#SP1_3_2_1_4_4_2_1" > § 1.3.2.1.4.4.2.1< / a > , < a href = "4-prf.html#SP1_3_2_1_4_4_2_2" > § 1.3.2.1.4.4.2.2< / a > < / span > < / button > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > wording< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > start< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > len< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > ) {< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > last_legal_position< / span > < span class = "plain-syntax" > = < / span > < a href = "3-wrd.html#SP7" class = "function-link" > < span class = "function-syntax" > Wordings::last_wn< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > W< / span > < span class = "plain-syntax" > ) - < / span > < span class = "identifier-syntax" > len< / span > < span class = "plain-syntax" > + < / span > < span class = "constant-syntax" > 1< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > while< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > < = < / span > < span class = "identifier-syntax" > last_legal_position< / span > < span class = "plain-syntax" > ) {< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > ;< / span >
2020-05-22 11:38:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > for< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > start< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > next_pt< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ptoken_category< / span > < span class = "plain-syntax" > == < / span > < span class = "constant-syntax" > FIXED_WORD_PTC< / span > < span class = "plain-syntax" > ) {< / span >
2020-05-13 01:33:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < a href = "4-prf.html#SP3" class = "function-link" > < span class = "function-syntax" > Preform::parse_fixed_word_ptoken< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > )) < / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > ++;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > break< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > } < / span > < span class = "reserved-syntax" > else< / span > < span class = "plain-syntax" > {< / span >
2020-05-13 01:33:17 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < a href = "4-prf.html#SP1" class = "function-link" > < span class = "function-syntax" > Preform::parse_nt_against_word_range< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > ,< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < a href = "3-wrd.html#SP5" class = "function-link" > < span class = "function-syntax" > Wordings::new< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > +< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "identifier-syntax" > max_words< / span > < span class = "plain-syntax" > -1),< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > NULL< / span > < span class = "plain-syntax" > , < / span > < span class = "identifier-syntax" > NULL< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > negated_ptoken< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > ?< / span > < span class = "identifier-syntax" > FALSE:TRUE< / span > < span class = "plain-syntax" > ;< / span >
2020-05-19 13:46:13 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > if< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > q< / span > < span class = "plain-syntax" > ) < / span > < span class = "identifier-syntax" > pos< / span > < span class = "plain-syntax" > += < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > nt_pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > opt< / span > < span class = "plain-syntax" > .< / span > < span class = "element-syntax" > nt_extremes< / span > < span class = "plain-syntax" > .< / span > < span class = "identifier-syntax" > max_words< / span > < span class = "plain-syntax" > ;< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > else< / 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" > pos< / span > < span class = "plain-syntax" > -< / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > > = < / span > < span class = "identifier-syntax" > len< / span > < span class = "plain-syntax" > ) < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > from< / span > < span class = "plain-syntax" > ++;< / span >
< span class = "plain-syntax" > }< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > -1;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
2020-08-27 17:50:24 +03:00
< p class = "commentary firstcommentary" > < a id = "SP3" class = "paragraph-anchor" > < / a > < b > § 3. < / b > Finally, a single fixed word, with its annotations and alternatives.
2020-05-03 03:01:21 +03:00
< / p >
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< pre class = "displayed-code all-displayed-code code-font" >
2020-05-19 18:36:50 +03:00
< span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "function-syntax" > Preform::parse_fixed_word_ptoken< / span > < button class = "popup" onclick = "togglePopup('usagePopup3')" > < span class = "comment-syntax" > ?< / span > < span class = "popuptext" id = "usagePopup3" > Usage of < span class = "code-font" > < span class = "function-syntax" > Preform::parse_fixed_word_ptoken< / span > < / span > :< br / > < a href = "4-prf.html#SP1_3_2_1_4_4_1" > § 1.3.2.1.4.4.1< / a > , < a href = "4-prf.html#SP1_3_2_1_4_4_2_3_1_1" > § 1.3.2.1.4.4.2.3.1.1< / a > , < a href = "4-prf.html#SP2" > § 2< / a > < / span > < / button > < span class = "plain-syntax" > (< / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > , < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ) {< / span >
2020-08-09 20:39:31 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > vocabulary_entry< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > ve< / span > < span class = "plain-syntax" > = < / span > < a href = "3-lxr.html#SP19" class = "function-link" > < span class = "function-syntax" > Lexer::word< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > );< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > int< / span > < span class = "plain-syntax" > < / span > < span class = "identifier-syntax" > m< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > disallow_unexpected_upper< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > ptoken< / span > < span class = "plain-syntax" > *< / span > < span class = "identifier-syntax" > alt< / 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" > alt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > alt< / span > < span class = "plain-syntax" > ; < / span > < span class = "identifier-syntax" > alt< / span > < span class = "plain-syntax" > = < / span > < span class = "identifier-syntax" > alt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > alternative_ptoken< / 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" > ve< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > alt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > ve_pt< / span > < span class = "plain-syntax" > ) & & < / span >
2020-05-13 01:33:17 +03:00
< span class = "plain-syntax" > ((< / span > < span class = "identifier-syntax" > m< / span > < span class = "plain-syntax" > == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > ) || (< / span > < a href = "2-nw.html#SP4" class = "function-link" > < span class = "function-syntax" > Word::unexpectedly_upper_case< / span > < / a > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > wn< / span > < span class = "plain-syntax" > ) == < / span > < span class = "identifier-syntax" > FALSE< / span > < span class = "plain-syntax" > )))< / span >
2020-05-03 03:01:21 +03:00
< span class = "plain-syntax" > < / span > < span class = "reserved-syntax" > return< / span > < span class = "plain-syntax" > (< / span > < span class = "identifier-syntax" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > negated_ptoken< / span > < span class = "plain-syntax" > )?< / span > < span class = "identifier-syntax" > FALSE:TRUE< / 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" > pt< / span > < span class = "plain-syntax" > -> < / span > < span class = "element-syntax" > negated_ptoken< / span > < span class = "plain-syntax" > )?< / span > < span class = "identifier-syntax" > TRUE:FALSE< / span > < span class = "plain-syntax" > ;< / span >
< span class = "plain-syntax" > }< / span >
< / pre >
< nav role = "progress" > < div class = "progresscontainer" >
2020-05-22 11:38:17 +03:00
< ul class = "progressbar" > < li class = "progressprev" > < a href = "4-ni.html" > ❮ < / a > < / li > < li class = "progresschapter" > < a href = "P-wtmd.html" > P< / a > < / li > < li class = "progresschapter" > < a href = "1-wm.html" > 1< / a > < / li > < li class = "progresschapter" > < a href = "2-vcb.html" > 2< / a > < / li > < li class = "progresschapter" > < a href = "3-lxr.html" > 3< / a > < / li > < li class = "progresscurrentchapter" > 4< / li > < li class = "progresssection" > < a href = "4-ap.html" > ap< / a > < / li > < li class = "progresssection" > < a href = "4-nnt.html" > nnt< / a > < / li > < li class = "progresssection" > < a href = "4-lp.html" > lp< / a > < / li > < li class = "progresssection" > < a href = "4-to.html" > to< / a > < / li > < li class = "progresssection" > < a href = "4-le.html" > le< / a > < / li > < li class = "progresssection" > < a href = "4-ni.html" > ni< / a > < / li > < li class = "progresscurrent" > prf< / li > < li class = "progresssection" > < a href = "4-bn.html" > bn< / a > < / li > < li class = "progresssection" > < a href = "4-ins.html" > ins< / a > < / li > < li class = "progresssection" > < a href = "4-pu.html" > pu< / a > < / li > < li class = "progressnext" > < a href = "4-bn.html" > ❯ < / a > < / li > < / ul > < / div >
2020-05-03 03:01:21 +03:00
< / nav > <!-- End of weave -->
2019-03-17 14:40:57 +02:00
2020-05-03 03:01:21 +03:00
< / main >
< / body >
< / html >
2019-03-17 14:40:57 +02:00