To avoid being distracted by content not involved in creating overlapping markup we
ignored the root element ([sonneteer} … {sonneteer]) and metadata (author and
title information), and focused instead on the following two hierarchies:
To create plain-text input for our experiment we removed the first (metadata) line
of
Piez’s LMNL example and stripped out all LMNL markup. The result is:
Tagging quoted text programmatically is problematic with this input because there
are
two instances and they are represented differently in the plain text. One quotation
opens on
the second line of verse and closes at the end of the poem, and that quotation is
demarcated
by typographic (curly) quotation marks. There is also, though, an embedded quotation
that
consists of one sentence that occupies two full lines:
Piez does not tag either of the quotations in his LMNL text. Although our output in
other respects seeks to replicate Piez’s LMNL tagging, we elected to replace the literal
typographic quotation marks in the plain-text input with LMNL start- and end-tags.
Like
Piez, we do not tag the embedded quote; we regard this as a compromise because recognizing
these two lines as quoted text requires analysis that might entail NLP processing
that is
not a realistic task for invisible-markup management.
Ozymandias
in separate IXML grammars
The following IXML grammar adds markup for the sonnet structure (only) to the
plain-text input:
{sonnet (root), octave, quatrain, sestet, tercet, line }
sonnet: octave, -#a, sestet.
octave: quatrain, -#a, quatrain.
quatrain: line, -#a, line, -#a, line, -#a, line.
sestet: tercet, -#a, tercet.
tercet: line, -#a, line, -#a, line.
line: ~[#a]+.
The unambiguous output is:
<sonnet>
<octave>
<quatrain>
<line>I met a traveller from an antique land,</line>
<line>Who said — “Two vast and trunkless legs of stone</line>
<line>Stand in the desart....Near them, on the sand,</line>
<line>Half sunk a shattered visage lies, whose frown,</line>
</quatrain>
<quatrain>
<line>And wrinkled lip, and sneer of cold command,</line>
<line>Tell that its sculptor well those passions read</line>
<line>Which yet survive, stamped on these lifeless things,</line>
<line>The hand that mocked them, and the heart that fed;</line>
</quatrain>
</octave>
<sestet>
<tercet>
<line>And on the pedestal, these words appear:</line>
<line>My name is Ozymandias, King of Kings,</line>
<line>Look on my Works, ye Mighty, and despair!</line>
</tercet>
<tercet>
<line>Nothing beside remains. Round the decay</line>
<line>Of that colossal Wreck, boundless and bare</line>
<line>The lone and level sands stretch far away.”</line>
</tercet>
</sestet>
</sonnet>
The following IXML grammar adds markup for the linguistic structure (only) to the
plain-text input:
ixml version "1.1".
sonnet: (s; q)+.
s: (q; phrp)*, (q; phr, sPunc).
phr: (-" "; -#a)?, text.
phrp>phr: -" "?, text, pPunc, nows.
-sPunc: ["?!"]; "."+.
-pPunc: [",;:"]; " —".
-text: [L], ([L]; ws)+, [L].
q: qStart, s+, qEnd.
-qStart: -"“".
-qEnd: -"”".
-sp: " ".
-eol: #a.
-ws: sp; eol.
-noeol: sp; -#a.
-nosp: -" "; #a.
-nows: -" "; -#a.
The unambiguous output is:
<sonnet>
<s>
<phr>I met a traveller from an antique land,</phr>
<phr>Who said —</phr>
<q>
<s>
<phr>Two vast and trunkless legs of stone
Stand in the desart</phr>....</s>
<s>
<phr>Near them,</phr>
<phr>on the sand,</phr>
<phr>Half sunk a shattered visage lies,</phr>
<phr>whose frown,</phr>
<phr>And wrinkled lip,</phr>
<phr>and sneer of cold command,</phr>
<phr>Tell that its sculptor well those passions read
Which yet survive,</phr>
<phr>stamped on these lifeless things,</phr>
<phr>The hand that mocked them,</phr>
<phr>and the heart that fed;</phr>
<phr>And on the pedestal,</phr>
<phr>these words appear:</phr>
<phr>My name is Ozymandias,</phr>
<phr>King of Kings,</phr>
<phr>Look on my Works,</phr>
<phr>ye Mighty,</phr>
<phr>and despair</phr>!</s>
<s>
<phr>Nothing beside remains</phr>.</s>
<s>
<phr>Round the decay
Of that colossal Wreck,</phr>
<phr>boundless and bare
The lone and level sands stretch far away</phr>.</s>
</q>
</s>
</sonnet>
Ozymandias
in one IXML grammar using alternative operator
As was the case with our Hamlet experiment, above, we can merge the two IXML grammars
for Ozymandias
by changing the first rule (for sonnet) to
allow either one pattern or the other, that is, to separate the two right-hand sides
with
an or connector (;). Below is an IXML grammar that does
that:
ixml version "1.1".
{ Concurrent linguistic and poetic hierarchies }
{ shared }
sonnet: (s; q)+; octave, -#a, sestet.
{ linguistic structure: s, phr, q }
s: (q; phrp)*, (q; phr, sPunc).
phr: (-" "; -#a)?, text.
phrp>phr: -" "?, text, pPunc, nows.
-sPunc: ["?!"]; "."+.
-pPunc: [",;:"]; " —".
-text: [L], ([L]; ws)+, [L].
q: qStart, s+, qEnd.
-qStart: -"“".
-qEnd: -"”".
-sp: " ".
-eol: #a.
-ws: sp; eol.
-noeol: sp; -#a.
-nosp: -" "; #a.
-nows: -" "; -#a.
{ poetic structure: octave, quatrain, sestet, tercet, line }
octave: quatrain, -#a, quatrain.
quatrain: line, -#a, line, -#a, line, -#a, line.
sestet: tercet, -#a, tercet.
tercet: line, -#a, line, -#a, line.
line: ~[#a]+.
The unification was simpler with Ozymandias
than with Hamlet because the only markup shared by the two hierarchies in
Ozymandias
is the root element. As expected, the output is ambiguous,
with one parse for each of the hierarchies:
<?xml version="1.0"?>
<ixml parses="2" totalParses="2">
<sonnet xmlns:ixml="http://invisiblexml.org/NS" ixml:state="ambiguous">
<s>
<phr>I met a traveller from an antique land,</phr>
<phr>Who said —</phr>
<q>
<s><phr>Two vast and trunkless legs of stone
Stand in the desart</phr>....</s>
<s><phr>Near them,</phr><phr>on the sand,</phr><phr>Half sunk a shattered visage lies,</phr><phr>whose frown,</phr><phr>And wrinkled lip,</phr><phr>and sneer of cold command,</phr><phr>Tell that its sculptor well those passions read
Which yet survive,</phr><phr>stamped on these lifeless things,</phr><phr>The hand that mocked them,</phr><phr>and the heart that fed;</phr><phr>And on the pedestal,</phr><phr>these words appear:</phr><phr>My name is Ozymandias,</phr><phr>King of Kings,</phr><phr>Look on my Works,</phr><phr>ye Mighty,</phr><phr>and despair</phr>!</s>
<s><phr>Nothing beside remains</phr>.</s>
<s><phr>Round the decay
Of that colossal Wreck,</phr><phr>boundless and bare
The lone and level sands stretch far away</phr>.</s>
</q>
</s>
</sonnet>
<sonnet xmlns:ixml="http://invisiblexml.org/NS" ixml:state="ambiguous">
<octave>
<quatrain>
<line>I met a traveller from an antique land,</line>
<line>Who said —Two vast and trunkless legs of stone</line>
<line>Stand in the desart....Near them,on the sand,</line>
<line>Half sunk a shattered visage lies,whose frown,</line>
</quatrain>
<quatrain>
<line>And wrinkled lip,and sneer of cold command,</line>
<line>Tell that its sculptor well those passions read</line>
<line>Which yet survive,stamped on these lifeless things,</line>
<line>The hand that mocked them,and the heart that fed;</line>
</quatrain>
</octave>
<sestet>
<tercet>
<line>And on the pedestal,these words appear:</line>
<line>My name is Ozymandias,King of Kings,</line>
<line>Look on my Works,ye Mighty,and despair!</line>
</tercet>
<tercet>
<line>Nothing beside remains.Round the decay</line>
<line>Of that colossal Wreck,boundless and bare</line>
<line>The lone and level sands stretch far away.</line>
</tercet>
</sestet>
</sonnet>
</ixml>
Ozymandias
(or surrogate) in IXML with complete LMNL and TexMECS
output
Our next task was to see whether IXML could create LMNL and TexMECS output with
overlapping markup in a single serialization. As with the Hamlet experiment, because IXML can serialize output only as XML:
-
We create a root XML element that contains the LMNL or TexMECS document as plain
text. The tags for that root element would subsequently need to be removed to create
a
well-formed LMNL or TexMECS document.
-
We suppress all XML tags and create LMNL or TexMECS tags using IXML string
insertions.
-
Because TexMECS uses angle brackets as tag delimiters and emitting plain-text
angle brackets is not possible in IXML (IXML output must be serialized XML, which
means that angle brackets [or, at least, opening angle brackets] must be escaped,
typically as character entities), we emit curly braces instead of angle brackets and
then transform them to angle brackets in post-processing.
The challenge to creating an IXML grammar for this task is that we need to manage
the
two hierarchies simultaneously. Because TexMECS is hierarchical, if we have a phrase
transition at the end of a line and want to serialize as TexMECS, we would need to
emit
output in the following order: 1) end phrase, 2) end line, 3) original end-of-line
character (if we wish to retain it), 4) start line, 5) start phrase. Because LMNL
tags are
not hierarchical, the order of tags at the same offset position in the plain text
is not
informational, but for human legibility we would prefer to output LMNL tags in the
same
order as TexMECS tags.
Managing two hierarchies simultaneously means handling all possible transitions from
a
combination of states in both to a different combination of states in both. The number
of
possible combinations with the two Ozymandias
hierarchies was so great that
it proved impractical for expository use, so we switched at this point to a four-line
poem
by Ogden Nash, entitled The Open Road
:
I think that I shall never see
A billboard lovely as a tree.
Perhaps, unless the billboards fall,
I’ll never see a tree at all.
We identified two hierarchies to tag in this poem:
A state consists of a combination of couplet, line, sentence, and phrase, which means
that there are sixteen possible states, where each of the four features (couplet,
line,
sentence, phrase) can be qualified with a 1
or 2
, e.g.,
c1-l1-s1-p1 (couplet #1, line #1, sentence #1, phrase #1), etc. The numbers
do not mean first
and second
; their purpose is that when we
move from one state to another, the same number means that that part of the state
does not
change and a different number means that it does. For example, a transition from
c1-l1-s1-p1 to c1-l2-s1-p1 corresponds to a phrasal enjambment
from the first line of a couplet to the second: the line changes, but the couplet,
sentence, and phrase remain the same. Any state can transition to any other state
except
that 1) a state cannot transition to the same state, 2) a change in couplet implies
a
change in line, and 3) a change in sentence implies a change in phrase. Additionally,
there is a start state (start must transition to
c1-l1-s1-p1) and an end state (which is only reachable from states that
would otherwise include a couplet transition and a sentence transition (because in
our
model a poem cannot end in the middle of a couplet or the middle of a sentence). The
result is that except for the start, every state can transition to exactly five or
six
other states, where the sixth is a transition to the end state. For example,
c1-l1-s1-p1 can transition to:
-
c1-l1-s1-p2 (change phrase in the middle of a line and sentence)
-
c1-l1-s2-p1 (change sentence in the middle of a line; the phrase number
is not informational because a new sentence always implies a new phrase)
-
c1-l2-s1-p2 (change line in the middle of a couplet while also
changing phrase in the middle of a sentence)
-
c1-l2-s2-p1 (change line in the middle of a couplet and start a new
sentence on the new line)
-
c1-l2-s1-p1 (change line in the middle of a couplet and continue the
same phrase, and therefore the same sentence; this is phrasal enjambment)
The total number of possible transitions is 89 (16 source states, half of which have
5
target states and half of which have 6, plus one transition from start).
Below is an unambiguous IXML grammar that creates LMNL output from The Open
Road
—all 143 lines of it!:
{ Run with: coffeepot -g:open-road-ixml-all-transitions-ixml-syntax.ixml -i:open-road.txt | sed '/^</d' }
start : +#a, +"[poem}", +#a, +"[c}[l}[s}[p}", c1-l1-s1-p1.
-end : +#a, +"{poem]", +#a.
-text : -" "*, ~[" "; #a], ([L]; ["’ "])+.
-pPunc : ",".
-sPunc : ".".
-eol : #a.
-c1-l1-s1-p1 : text,
(
pPunc, +"{p] [p}", c1-l1-s1-p2;
+"{p]", sPunc, +"{s] [s}[p}", c1-l1-s2-p1;
+"{p]{l]", pPunc, eol, +"[l}[p}", c1-l2-s1-p2;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c1-l2-s2-p1;
+"{l]", eol, +"[l}", c1-l2-s1-p1
).
-c1-l1-s1-p2 : text,
(
pPunc, +"{p] [p}", c1-l1-s1-p1;
+"{p]", sPunc, +"{s] [s}[p}", c1-l1-s2-p1;
+"{l]", eol, +"[l}", c1-l2-s1-p2;
+"{p]{l]", pPunc, eol, +"[l}[p}", c1-l2-s1-p1;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c1-l2-s2-p1
).
-c1-l1-s2-p1 : text,
(
pPunc, +"{p] [p}", c1-l1-s2-p2;
+"{p]", sPunc, +"{s] [s}[p}", c1-l1-s1-p1;
+"{l]", eol, +"[l}", c1-l2-s2-p1;
+"{p]{l]", pPunc, eol, +"[l}[p}", c1-l2-s2-p2;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c1-l2-s1-p1
).
-c1-l1-s2-p2 : text,
(
pPunc, +"{p] [p}", c1-l1-s2-p1;
+"{p]", sPunc, +"{s] [s}[p}", c1-l1-s1-p1;
+"{l]", eol, +"[l}", c1-l2-s2-p2;
+"{p]{l]", pPunc, eol, +"[l}[p}", c1-l2-s2-p1;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c1-l2-s1-p1
).
-c1-l2-s1-p1 : text,
(
pPunc, +"{p] [p}", c1-l2-s1-p2;
+"{p]", sPunc, +"{s] [s}[p}", c1-l2-s2-p1;
+"{l]{c]", eol, +"[c}[l}", c2-l1-s1-p1;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c2-l1-s1-p2;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c2-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c1-l2-s1-p2 : text,
(
pPunc, +"{p] [p}", c1-l2-s1-p1;
+"{p]", sPunc, +"{s] [s}[p}", c1-l2-s2-p1;
+"{l]{c]", eol, +"[c}[l}", c2-l1-s1-p2;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c2-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c2-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c1-l2-s2-p1 : text,
(
pPunc, +"{p] [p}", c1-l2-s2-p2;
+"{p]", sPunc, +"{s] [s}[p}", c1-l2-s1-p1;
+"{l]{c]", eol, +"[c}[l}", c2-l1-s2-p1;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c2-l1-s2-p2;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c2-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c1-l2-s2-p2 : text,
(
pPunc, +"{p] [p}", c1-l2-s2-p1;
+"{p]", sPunc, +"{s] [s}[p}", c1-l2-s1-p1;
+"{l]{c]", eol, +"[c}[l}", c2-l1-s2-p2;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c2-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c2-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c2-l1-s1-p1 : text,
(
pPunc, +"{p] [p}", c2-l1-s1-p2;
+"{p]", sPunc, +"{s] [s}[p}", c2-l1-s2-p1;
+"{l]", eol, +"[l}", c2-l2-s1-p1;
+"{p]{l]", pPunc, eol, +"[l}[p}", c2-l2-s1-p2;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c2-l2-s2-p1
).
-c2-l1-s1-p2 : text,
(
pPunc, +"{p] [p}", c2-l1-s1-p1;
+"{p]", sPunc, +"{s] [s}[p}", c2-l1-s2-p1;
+"{l]", eol, +"[l}", c2-l2-s1-p2;
+"{p]{l]", pPunc, eol, +"[l}[p}", c2-l2-s1-p1;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c2-l2-s2-p1
).
-c2-l1-s2-p1 : text,
(
pPunc, +"{p] [p}", c2-l1-s2-p2;
+"{p]", sPunc, +"{s] [s}[p}", c2-l1-s1-p1;
+"{l]", eol, +"[l}", c2-l2-s2-p1;
+"{p]{l]", pPunc, eol, +"[l}[p}", c2-l2-s2-p2;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c2-l2-s1-p1
).
-c2-l1-s2-p2 : text,
(
pPunc, +"{p] [p}", c2-l1-s2-p1;
+"{p]", sPunc, +"{s] [s}[p}", c2-l1-s1-p1;
+"{l]", eol, +"[l}", c2-l2-s2-p2;
+"{p]{l]", pPunc, eol, +"[l}[p}", c2-l2-s2-p1;
+"{p]", sPunc, +"{s]{l]", eol, +"[l}[s}[p}", c2-l2-s1-p1
).
-c2-l2-s1-p1 : text,
(
pPunc, +"{p] [p}", c2-l2-s1-p2;
+"{p]", sPunc, +"{s] [s}[p}", c2-l2-s2-p1;
+"{l]{c]", eol, +"[c}[l}", c1-l1-s1-p1;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c1-l1-s1-p2;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c1-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c2-l2-s1-p2 : text,
(
pPunc, +"{p] [p}", c2-l2-s1-p1;
+"{p]", sPunc, +"{s] [s}[p}", c2-l2-s2-p1;
+"{l]{c]", eol, +"[c}[l}", c1-l1-s1-p2;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c1-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c1-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c2-l2-s2-p1 : text,
(
pPunc, +"{p] [p}", c2-l2-s2-p2;
+"{p]", sPunc, +"{s] [s}[p}", c2-l2-s1-p1;
+"{l]{c]", eol, +"[c}[l}", c1-l1-s2-p1;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c1-l1-s2-p2;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c1-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
-c2-l2-s2-p2 : text,
(
pPunc, +"{p] [p}", c2-l2-s2-p1;
+"{p]", sPunc, +"{s] [s}[p}", c2-l2-s1-p1;
+"{l]{c]", eol, +"[c}[l}", c1-l1-s2-p2;
+"{p]", pPunc, +"{l]{c]", eol, +"[c}[l}[p}", c1-l1-s2-p1;
sPunc, +"{p]{s]{l]{c]", eol, +"[c}[l}[s}[p}", c1-l1-s1-p1;
sPunc, +"{p]{s]{l]{c]", -#a?, end
).
The output of transforming the plain-text input with the grammar above (and piping
the
result into the sed operation described in the initial comment) is:
[poem}
[c}[l}[s}[p}I think that I shall never see{l]
[l}A billboard lovely as a tree.{p]{s]{l]{c]
[c}[l}[s}[p}Perhaps,{p] [p}unless the billboards fall{p]{l],
[l}[p}I’ll never see a tree at all.{p]{s]{l]{c]
{poem]
If we modify the grammar to emit TexMECS markup instead of LMNL, the output is:
<poem|
<c|<l|<s|<p|I think that I shall never see|l>
<l|A billboard lovely as a tree.|p>|s>|l>|c>
<c|<l|<s|<p|Perhaps,|p> <p|unless the billboards fall|p>|l>,
<l|<p|I’ll never see a tree at all.|p>|s>|l>|c>
|poem>
A comparison of IXML grammars to tag The Open Road
and
Ozymandias
invites us to consider three features:
-
Both poems have two hierarchies, one for poetic structure and one for linguistic
structure. From this perspective the two poems are equivalent.
-
Both hierarchies in Ozymandias
are more complex than their
counterparts in Open Road. Specifically:
-
The poetic-structure hierarchy for The Open Road
has two
levels: couplet and line. A poem in couplets can have any number of couplets, but
there are only four possible couplet/line states, so that, for example, a
combination like c1-l1 would repeat every fourth line.
The poetic-structure hierarchy for Ozymandias
has three levels:
octave/sestet, quatrain/tercet, and line. Each of the fourteen lines of
Ozymandias
is in a different poetic state, that is, a different
combination of those three levels, and this lets us use a 14-valued l
(line) property as a surrogate for all existing combinations of values on the
three tiers. For example, just l1 (line 1) implies
o-q1-l1 (octave [there is exactly one], quatrain 1, line 1). The
only possible transition from l1 is to l2, etc. This is
more than the four possible combinations in Open Road, each with exactly one or
two possible transitions (sometimes two because both c1-l2 and
c2-l2 can transition either to a new first line of a different
couplet or to the end state), but it is finite, which means that by itself (that
is, as long as we don’t also factor in the linguistic structure) it does not
preclude constructing grammar rules for all possible transitions.
-
Linguistic structure: The Open Road
has two levels: sentence
and phrase. Ozymandias
also includes quotes, which, in our
(simplified) model, can occur wherever phrases can occur and which must contain
one or more sentences.
-
The linguistic structure of Ozymandias
is recursive. As we note
above, lines 10–11 (My name is Ozymandias …
) actually constitute a
quote, and the only reason we did not tag it as such is that detecting it required
NLP
that could not realistically be implemented in a robust fashion with only IXML.
Insofar as sentences can contain quotes and quotes must contain sentences, those two
element types can nest infinitely. This is not the case with The Open
Road
, where neither hierarchy is recursive.
What makes the number of possible state transitions with Ozymandias
infinite is the combination of multiple hierarchies and infinite recursion (in one
hierarchy). With just one (but not both) of those conditions:
-
As our treatment of The Open Road
shows, combining multiple
hierarchies has a finite (even if potentialy large) number of possible transitions
when there is no recursion.
-
As our IXML grammar for just the linguistic hierarchy in Ozymandias
shows, infinite recursion is a not a problem with a single hierarchy because we do
not
need to spell out (flatten) the infinite number of possible patterns.
-
If we want both multiple hierarchies and recursion, we could enumerate all of the
potential states if we artificially capped the depth of recursion. This, though, would
effective make the model non-recursive.
Why isn’t it possible to write an IXML grammar that will track two independent
hierarchies, one of which is genuinely recursive? The issue is that we would need
to
flatten the combinations, as we did with our Open Road
solution, and
because the recursion is infinite, a string that describes any possible state is
infinitely long. For example: whether we move from a state with the same (current)
sentence to one with a different sentence inside a quote is independent of whether
that
quote is inside an s1 or s2. That containing sentence, in turn,
could be inside a quote, which is inside a sentence at a higher containing level,
etc.
Because the number of containing levels is infinite, the number of state combinations
is
not enumerable.
As we illustrate below, this combination is fully tractable with
Invisible-Next.