A year ago I did some initial work developing a PHP implementation for such a parser: <a href="http://open-scriptures.googlecode.com/svn/branches/php-prototypes/reference-parser.lib.php">http://open-scriptures.googlecode.com/svn/branches/php-prototypes/reference-parser.lib.php</a><br>

<br>Maybe the algorithms would be of use to you. I only refined it for New Testament references.<br><br><div class="gmail_quote">On Fri, Nov 20, 2009 at 5:28 AM, DM Smith <span dir="ltr">&lt;<a href="mailto:dmsmith@crosswire.org">dmsmith@crosswire.org</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">SWORD&#39;s ability to parse arbitrary input into a list of verses is awesome. It is far more powerful than what is needed for an osisID or an osisRef.<br>


<br>
The structure of these for biblical references is very well defined.<br>
<br>
Here is a partial BNF for it. (I&#39;ve simplified/extended the BNF with [ ] to represent optional instead of using ε for the empty production and allow them to be anywhere.)<br>
<br>
# An osisRef can be a space separated list of osisRefs<br>
# or two osisIDs separated by a dash<br>
osisRef         ::=     &lt;osisRef&gt; &quot; &quot; &lt;osisRef&gt;<br>
                        |       &lt;osisID&gt; [ &quot;-&quot; &lt;osisID&gt; ]<br>
<br>
# An osisID is a reference with optional work prefix and/or grain,<br>
osisID          ::=     [ &lt;workPrefix&gt; &quot;:&quot; ] &lt;reference&gt; [ &quot;!&quot; &lt;grain&gt; ]<br>
<br>
# A reference has a book name and can be followed by a chapter and a verse, separated by a period &#39;.&#39;<br>
reference       ::=     &lt;bookname&gt;<br>
                        |       &lt;bookname&gt; &quot;.&quot; &lt;number&gt;<br>
                        |       &lt;bookname&gt; &quot;.&quot; &lt;number&gt; &quot;.&quot; &lt;number&gt;<br>
<br>
#Book names are normalized to a particular list, including the deuterocanonical books.<br>
bookname        :=      &quot;Gen&quot; | &quot;Exod&quot; | &quot;Lev&quot; | ... skipping for brevity... | &quot;Rev&quot;<br>
<br>
# the numbers are a nonzero and never have leading zeros<br>
number          ::=     &lt;nzdigit&gt; [ &lt;digits&gt; ]<br>
<br>
nzdigit         ::=     &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot; | &quot;8&quot; | &quot;9&quot;<br>
digit                   ::=     &quot;0&quot; |  &lt;nzdigit&gt;<br>
<br>
digits          ::=     &lt;digit&gt; [ &lt;digits&gt; ]<br>
<br>
workPrefix      ::=     .....<br>
grain           ::=     .....<br>
<br>
I&#39;d like to write parseOsisRef and parseOsisID and use it within osis2mod.<br>
Right now, I have to munge the osisRefs and osisIDs to a form that ParseVerseList will understand.<br>
<br>
The code will be much simpler and much faster than ParseVerseList. Here are some of the specialties of ParseVerseList that don&#39;t need to be handled.<br>
a) It understands internationalized book names<br>
b) It understands all kinds of abbreviations for book names<br>
c) It allows roman numerals in book names.<br>
d) It does not require a book name for a reference, but uses the last seen reference&#39;s book name as a basis.<br>
e) Likewise, it does not require a chapter number for a verse references, but uses the last seen reference&#39;s book and chapter as a basis.<br>
f) It allows special constructs such as &quot;v 3&quot;, &quot;c 4&quot; and &quot;9f&quot; and &quot;12ff&quot; for verse, chapter, next verse and to the end of the chapter. (There are other special constructs.)<br>
<br>
Any input?<br>
<br>
In Him,<br>
        DM<br>
<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
sword-devel mailing list: <a href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a><br>
<a href="http://www.crosswire.org/mailman/listinfo/sword-devel" target="_blank">http://www.crosswire.org/mailman/listinfo/sword-devel</a><br>
Instructions to unsubscribe/change your settings at above page</blockquote></div><br>