В процесі виконання завдань по
курсу компіляторів на Coursera раптово відкрив для себе, що римські цифри описуються контекстно-вільною граматикою, ось її шматочок (in the second production of S, the first token is a lowercase L, тому що термінали, тобто самі римські цифри, тут позначаються маленькою літерою, нетермінали великою):
S productions S -> x.T.U | l.X | X
T productions T -> c | l (lowercase L)
X productions X -> x.X | U
U productions U -> i.Y | v.I | I (all uppercase i's)
Y productions Y -> x | v
I productions I -> i | i.i | i.i.i
От і вся премудрість римських цифр.
Недивно, що людство неабияк полегшило собі життя переходом на систему числення з регулярною граматикою, яка породжується елементарним регулярним виразом
[0..9]*