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);
...