Roman Numeral Parser

by Taylor Lopez

HTML

<input id="input" type="text" /><button id="button">Convert</button>
<table>
  <tr>
    <th>Input</th><th>Value</th>
  </tr>
  <tr>
    <td id="formattedInput"></td><td id="output"></td>
  </tr>
</table>

JavaScript

/*
	This Roman Numeral Parser is based on the following BNF:
  I'd like to continue to refine this as I believe there are some redundancies in it,
  but as far as I can tell, it works just fine.
  
  num :== ( num ) num
       || | num | num
       || thou
       
  thou :== thod hun
        || hun
  hun :== hund ten
       || ten
  ten :== tend one
       || one
  one :== oned
  
  thod :== mM
  hund :== C M
        || C D
        || D mC
        || D
        || mC
  tend :== X C
        || X L
        || L mX
        || L
        || mX
  oned :== I X
        || I V
        || V mI
        || V
        || mI
        || [EMPTY STRING]
  
  mM :== M mM
  		|| M
	mC :== C mC
      || C
  mX :== X mX
  		|| X
  mI :== I mI
  		|| I
*/

(function(){
	function main()
  {
  	var rnp = new RomanNumeralParser();
    
    /* Unit tests:
    console.log(rnp.parse("(V)") === 5000);
    console.log(rnp.parse("(X)") === 10000);
    console.log(rnp.parse("(XXV)") === 25000);
    console.log(rnp.parse("(L)") === 50000);
    console.log(rnp.parse("(|I|)") === 100000);
    console.log(rnp.parse("(|II|)(L)") === 250000);
    console.log(rnp.parse("(|V|)") === 500000);
    console.log(rnp.parse("(|X|)") === 1000000);
    console.log(rnp.parse("(|XXV|)") === 2500000);
    console.log(rnp.parse("(|L|)") === 5000000);
    console.log(rnp.parse("(|C|)") === 10000000);
    console.log(rnp.parse("(|CCL|)") === 25000000);
    console.log(rnp.parse("(|D|)") === 50000000);
    console.log(rnp.parse("(|M|)") === 100000000);
    console.log(rnp.parse("(|MMD|)") === 250000000);
    console.log(rnp.parse("(|MMMM|)") === 400000000);
    console.log(rnp.parse("(|MMMMCMXC|)") === 499000000);
    console.log(rnp.parse("(|MMMMCMXCIX|)") === 499900000);
    console.log(rnp.parse("(V)") === 5000);
    console.log(rnp.parse("(X)") === 10000);
    console.log(rnp.parse("(XXV)") === 25000);
    console.log(rnp.parse("(L)") === 50000);
    console.log(rnp.parse("|(I)|") === 100000);
   ...