<html xmlns="http://www.w3.org/1999/xhtml" a0:Name="SuikaWiki" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:Version="0.9"><head></head><body><p><a0:anchor-end a0:anchor="1">[1]</a0:anchor-end> <dfn>HyTime <a0:rubyb>字句模型記法<rt>lexical model notation</rt></a0:rubyb></dfn>
(<dfn>HyLex</dfn>) は、<a0:anchor>字句模型</a0:anchor>を記述するための方法の一種として
<a0:anchor>ISO/IEC 10744</a0:anchor>:1997 で規定されている表記法です。</p><p>仕様書: ISO/IEC 10744:1997<ul><li>A.2.2 <a0:anchor-external a0:resScheme="URI" a0:resParameter="http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.2.2.html">http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.2.2.html</a0:anchor-external></li><li>A.2.3 <a0:anchor-external a0:resScheme="URI" a0:resParameter="http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.2.3.html">http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.2.3.html</a0:anchor-external></li></ul></p><a0:form ref="comment"></a0:form><section><h1>構文</h1><p><a0:anchor-end a0:anchor="2">[2]</a0:anchor-end> HyLex の構文は、基本的には <a0:anchor>SGML</a0:anchor>
の<a0:anchor>内容模型</a0:anchor>の構文と同じですが、幾つかの違いがあります。</p><ul><li><a0:anchor-end a0:anchor="5">[5]</a0:anchor-end> 下位模型群で <code class="SGML">GRPO</code>, <code class="SGML">GRPC</code>
の代わりに <code class="SGML"><a0:anchor>DSO</a0:anchor></code>, <code class="SGML"><a0:anchor>DSC</a0:anchor></code>
を使って、<dfn><a0:rubyb>一致字句模型<rt>match token model</rt></a0:rubyb></dfn>を定義できます。<ul><li>字句パターンの検索に使用する時には、
一致字句模型を満足するデータの部分を<dfn><a0:rubyb>一致字句<rt>match token</rt></a0:rubyb></dfn>と呼び、検索の結果として返します。</li><li>字句型の規定のために使用する時には、
単に下位模型群としての意味だけを持ちます。</li></ul></li></ul><ul><li><code class="ABNF"><dfn>HyLex 模型</dfn> := 模型群の内容</code></li><li><code class="ABNF"><dfn>真の模型群</dfn> := <code class="SGML"><a0:anchor>grpo</a0:anchor></code> 模型群の内容 <code class="SGML"><a0:anchor>grpc</a0:anchor></code></code></li><li><code class="ABNF"><dfn>一致字句模型群</dfn> := <code class="SGML"><a0:anchor>dso</a0:anchor></code> 模型群の内容 <code class="SGML"><a0:anchor>dsc</a0:anchor></code></code></li><li><code class="ABNF"><dfn>模型群の内容</dfn> := *<code class="SGML"><a0:anchor>ts</a0:anchor></code> 模型群の要素 *(*<code class="SGML">ts</code> 接続子 模型群の要素) *<code class="SGML">ts</code></code></li><li><code class="ABNF"><dfn>模型群の要素</dfn> := 内容字句など [出現標識 / *(<code class="SGML"><a0:anchor>rni</a0:anchor></code> ORDER 辞書式順序名 / <code class="SGML">rni</code> CHECK 追加字句制約名)] / <code class="SGML">rni</code> NOT 内容字句など</code></li><li><code class="ABNF"><code>内容字句など</code> := 内容字句 / 真の模型群 / 一致字句模型群</code></li><li><code class="ABNF"><dfn>内容字句</dfn> := <a0:anchor>表記</a0:anchor> / &lt;以前に宣言された<a0:anchor>字句型名</a0:anchor>&gt;</code></li><li><code class="ABNF"><dfn>接続子</dfn> := <code class="SGML"><a0:anchor>or</a0:anchor></code> / <code class="SGML"><a0:anchor>seq</a0:anchor></code></code></li></ul><p>仕様書の文章をもとに ABNF にしてみました。
(一部 <code class="SGML">ts</code> が抜けています。)
ISO 8879 に合わせて <code class="SGML">ts</code> ですが、
たぶん引数実体参照は使えないので、実際には <code class="SGML"><a0:anchor>s</a0:anchor></code>
です。</p><p>(生成規則くらい規格に書いておいてほしいなあ。)</p><p><a0:anchor-end a0:anchor="4">[4]</a0:anchor-end></p><dl><dt><code class="SGML">NOT</code></dt><dd>一致しないものと一致します。
<a0:weak>(正規表現の <code class="regex">^</code> のようなものですが、文字ではなく文字列が対象です。)</a0:weak>
HyLex では一致個数を制限する方法はありません。
使用例をみると零個以上無限大個と一致するみたいです。</dd><dt><code class="SGML">ORDER</code></dt><dd>一致を試みる前に適用する<a0:anchor>辞書式順序</a0:anchor>を指定します。</dd><dt><code class="SGML">CHECK</code></dt><dd>内容字句や模型群に一致したデータに適用する追加<a0:anchor>字句制約</a0:anchor>の名前を指定します。
この追加字句制約を満足しなくても一致処理に影響はありません。
(とはどういう意味? 単に誤りとして報告しないというだけか、あるいはそこまでの一致を取り消すこともないのか。)</dd></dl><p><a0:anchor-end a0:anchor="6">[6]</a0:anchor-end>
陽には規定されていませんけど、やはり <a0:anchor>SGML内容模型</a0:anchor>と同様に後戻りはなしでしょうか。</p><a0:form ref="comment"></a0:form></section><section><h1>正規化字句模型</h1><p><a0:anchor-end a0:anchor="11">[11]</a0:anchor-end> 字句型が本質的に<a0:anchor>空白</a0:anchor>で分離した字句の並びであるときには、「正規化」模型を使用できます。</p><p>正規化模型はデータ属性 <code class="SGMLa">norm</code> の値を
<code class="SGML">norm</code> とします (既定値)。
非正規化模型は <code class="SGML">unorm</code> とします。</p><p><a0:anchor-end a0:anchor="12">[12]</a0:anchor-end> 正規化模型は、次の手順で非正規化模型に変換できます。</p><ol><li>各<a0:anchor>表記</a0:anchor>内容字句の後に、修飾子
<code class="SGML">#ORDER SGMLCASE</code> を置く
(<code>SGMLCASE</code> は <code><a0:anchor>ISO 8879:1986//NOTATION LEXORD Namecase substitution//EN</a0:anchor></code>)。</li><li>各内容字句を一致字句模型とする。
このとき、 <code class="SGML">#ORDER</code> と <code class="SGML">#CHECK</code>
は一致字句模型群に入れるが、出現標識は除く。<ul><li>例: <code class="SGML">(a, b #CHECK c, d*, (e, f+))</code> →
<code class="SGML">([a], [b #CHECK c], [d]*, ([e], [f]+))</code></li></ul></li><li>連続下位模型群の間に <code class="SGML">s+</code> を挿入する。<ul><li>例: <code class="SGML">( NMTOKEN+, ( '#ANY', NUMBER )* )</code>
→ <code class="SGML">( [NMTOKEN]+, <ins>s+,</ins> ( ['#ANY' #ORDER SGMLCASE], <ins>s+,</ins> [NUMBER] )* )</code></li></ul></li><li><code class="SGML"><a0:anchor>PLUS</a0:anchor></code> と <code class="SGML"><a0:anchor>REP</a0:anchor></code> のついた下位模型群を開く:<ul><li><code class="SGML"><var>(m)</var>+</code> → <code class="SGML">( <var>(m)</var>, ( s+, <var>(m)</var> )* )</code></li><li><code class="SGML"><var>(m)</var>*</code> → <code class="SGML">( <var>(m)</var>?, ( s+, <var>(m)</var> )* )</code></li><li>元の <var>(m)</var> が一致字句模型群なら、対応する <var>(m)</var>
も一致字句模型群とする。</li></ul></li><li>最上位模型群が <code class="SGML"><a0:anchor>OR</a0:anchor></code> 群なら、
その一つ上に連続群を置く。<ul><li>例: <samp class="SGML">(a | b)</samp> → <samp class="SGML">( ([a] | [b]) )</samp></li></ul></li><li>最上位模型群の最初と最後に <code class="SGML">s*</code> を挿入する。<ul><li>例: <samp class="SGML">(a | b)</samp> → <samp class="SGML">(s*, ([a] | [b]), s*)</samp>]]</li></ul></li></ol><p><a0:anchor-end a0:anchor="12">[12]</a0:anchor-end> <a0:anchor>ISO/IEC 10744</a0:anchor>:1997 の<a0:anchor>マーク宣言</a0:anchor>の注釈にある、
<a0:anchor>属性</a0:anchor>や<a0:anchor>データ内容</a0:anchor>の<a0:anchor>字句型</a0:anchor>の定義
(<a0:anchor>表記法注釈</a0:anchor>) で、 <code>Lextype:</code> の後に記述されているものは正規化模型
(<code class="SGML"><code class="SGMLa">norm</code>=norm</code>),
<code>Ulextype:</code> の後に記述されているものは非正規化模型
(<code class="SGML"><code class="SGMLa">norm</code>=unorm</code>) です。</p><a0:form ref="comment"></a0:form></section><section><h1>公開識別子と属性</h1><p><a0:anchor-end a0:anchor="7">[7]</a0:anchor-end> HyLex の<a0:anchor>公開識別子</a0:anchor>は
<code>ISO/IEC 10744:1997//NOTATION HyTime lexical model notation (HyLex)//EN</code>
です。</p><p><a0:anchor-end a0:anchor="8">[8]</a0:anchor-end> 属性:<table><tbody><tr><td>名前</td><td>値の型</td><td>既定値</td><td>説明</td></tr><tr><td><code class="SGMLa"><a0:anchor>norm</a0:anchor></code></td><td><code class="SGML">norm | unorm</code></td><td><code class="SGML">norm</code></td><td>正規化</td></tr><tr><td><code class="SGML"><a0:anchor>altreps</a0:anchor></code></td></tr><tr><td><code class="SGML"><a0:anchor>included</a0:anchor></code></td></tr><tr><td><code class="SGML"><a0:anchor>superdcn</a0:anchor></code></td></tr></tbody></table></p><p><a0:anchor-end a0:anchor="9">[9]</a0:anchor-end> 宣言例:<pre class="SGML">&lt;!<a0:anchor>NOTATION</a0:anchor> HyLex
  <a0:anchor>PUBLIC</a0:anchor> &quot;ISO/IEC 10744:1997//NOTATION
          HyTime lexical model notation (HyLex)//EN&quot;&gt;
&lt;!<a0:anchor>ATTLIST</a0:anchor> #NOTATION HyLex
  norm (norm | unorm) norm
  %ga.common.attrib;
&gt;</pre></p><p><a0:anchor-end a0:anchor="10">[10]</a0:anchor-end> HyLex は<a0:anchor>一般体系</a0:anchor>
(<code>ISO/IEC 10744:1997//DTD AFDR Meta-DTD General Architecture//EN</code>)
で記法 <code>HyLex</code> として宣言されています。</p></section></body></html>