US_BIG_MONEY [ VLIB_US_BIG_MONEY:z {} ] VLIB_US_BIG_MONEY [ ; fifty, fifty three dollars even, one hundred dollars ( VSUB_BIG_DOLLAR_OPTIONAL_AMOUNT:d ?VSUB_BIG_EVEN ) {return([])} ; one fifty even ( VSUB_DIGIT_ONE_THRU_NINE:h VSUB_BIG_MONEY_THRU_99_WITH_OH:u VSUB_BIG_EVEN ) {return([])} ; two bucks, a hundred bucks (small and round amounts only) VSUB_BIG_BUCKS_AMOUNT:d {return([])} ; a buck twenty five (only place buck is allowed with non-zero cents) ( a buck VSUB_BIG_MONEY_THRU_99:c ) {return([ ])} ; sixty two cents, no dollars and nine cents ( ?( [ no zero ] ?( dollars ?and ) ) VSUB_BIG_MONEY_THRU_99:c cents ) {return([])} ; one cent ( ?( [ no zero ] ?( dollars ?and ) ) one cent ) {return([])} ; five dollars and twenty seven cents, four dollars thirty cents ( VSUB_BIG_DOLLAR_REQUIRED_AMOUNT:d ?and VSUB_BIG_MONEY_THRU_99:c cents ) {return([ ])} ; five dollars and one cent, four dollars one cent ( VSUB_BIG_DOLLAR_REQUIRED_AMOUNT:d ?and one cent ) {return([ ])} ; forty two oh six ( VSUB_BIG_MONEY_THRU_99:d VSUB_BIG_MONEY_THRU_99_WITH_OH:c ) {return([ ])} ; one hundred seventeen twenty ( VSUB_DIGIT_ONE_THRU_NINE:h hundred ?and VSUB_BIG_MONEY_THRU_99:u VSUB_BIG_MONEY_THRU_99_WITH_OH:c ) {return([ ])} ; five thirty four fifty, one oh four ninety nine ( VSUB_DIGIT_ONE_THRU_NINE:h VSUB_BIG_MONEY_THRU_99_WITH_OH:u VSUB_BIG_MONEY_THRU_99_WITH_OH:c ) {return([ ])} ; ten million dollars, just to make the end point a round number ( ten million [ dollars bucks ] ) {return([])} ] VSUB_BIG_DOLLAR_REQUIRED_AMOUNT [ ( [ a one ] dollar ) {return(1)} ( VSUB_BIG_DOLLARS_AMOUNT:d dollars ) {return($d)} ] VSUB_BIG_DOLLAR_OPTIONAL_AMOUNT [ ( one ?dollar ) {return(1)} ( a dollar ) {return(1)} ( VSUB_BIG_DOLLARS_AMOUNT:d ?dollars ) {return($d)} ] VSUB_BIG_DOLLARS_AMOUNT [ ( ?a hundred ) {return(100)} ( ?a thousand ) {return(1000)} ( ?a million ) {return(1000000)} VSUB_BIG_MONEY_THRU_999:d {return($d)} ( VSUB_BIG_MONEY_THRU_999:t thousand ) {return(mul(1000 $t))} ( VSUB_BIG_MONEY_THRU_999:t thousand VSUB_BIG_MONEY_THRU_999:u ) {return(add(mul(1000 $t) $u))} ( VSUB_TEEN:h hundred ) {return(mul(100 $h))} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:h hundred ) {return(mul(100 add($t $h)))} ( VSUB_TEEN:h hundred ?and VSUB_BIG_MONEY_THRU_99:u ) {return(add(mul(100 $h) $u))} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:h hundred ?and VSUB_BIG_MONEY_THRU_99:u ) {return(add(mul(100 add($t $h)) $u))} ( VSUB_DIGIT_ONE_THRU_NINE:m million ) {return(mul(1000000 $m))} ( VSUB_DIGIT_ONE_THRU_NINE:m million VSUB_BIG_MONEY_THRU_999:u ) {return(add(mul(1000000 $m) $u))} ( VSUB_DIGIT_ONE_THRU_NINE:m million VSUB_BIG_MONEY_THRU_999:t thousand ) {return(add(mul(1000000 $m) mul(1000 $t)))} ( VSUB_DIGIT_ONE_THRU_NINE:m million VSUB_BIG_MONEY_THRU_999:t thousand VSUB_BIG_MONEY_THRU_999:u ) {return(add(mul(1000000 $m) add(mul(1000 $t) $u)))} ] VSUB_BIG_BUCKS_AMOUNT [ ( VSUB_BIG_MONEY_THRU_999:d bucks ) {return($d)} ( a hundred bucks ) {return(100)} ( VSUB_TEEN:h hundred bucks ) {return(mul(100 $h))} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:h hundred bucks ) {return(mul(100 add($t $h)))} ( a thousand bucks ) {return(1000)} ( [ VSUB_DIGIT_ONE_THRU_NINE:h VSUB_TEEN:h ] thousand bucks ) {return(mul(1000 $h))} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:h thousand bucks ) {return(mul(1000 add($t $h)))} ( a million bucks ) {return(1000000)} ( VSUB_DIGIT_ONE_THRU_NINE:m million bucks ) {return(mul(1000000 $m))} ] VSUB_BIG_MONEY_THRU_999 [ VSUB_BIG_MONEY_THRU_99:d {return($d)} ( VSUB_DIGIT_ONE_THRU_NINE:h hundred ) {return(mul(100 $h))} ( VSUB_DIGIT_ONE_THRU_NINE:h hundred ?and VSUB_BIG_MONEY_THRU_99:u ) {return(add(mul(100 $h) $u))} ] VSUB_BIG_MONEY_THRU_99 [ VSUB_DIGIT_ONE_THRU_NINE:d {return($d)} VSUB_TEEN:d {return($d)} ten {return(10)} VSUB_DECADE:t {return($t)} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:u ) {return(add($t $u))} ] VSUB_BIG_MONEY_THRU_99_WITH_OH [ ( oh VSUB_DIGIT_ONE_THRU_NINE:n ) {return($n)} VSUB_TEEN:n {return($n)} ten {return(10)} VSUB_DECADE:t {return($t)} ( VSUB_DECADE:t VSUB_DIGIT_ONE_THRU_NINE:u ) {return(add($t $u))} ] VSUB_BIG_EVEN [ even exactly ( ?and [ no zero ] cents ) ] VSUB_DIGIT_TWO_THRU_NINE [ two {return(2)} three {return(3)} four {return(4)} five {return(5)} six {return(6)} seven {return(7)} eight {return(8)} nine {return(9)} ] VSUB_DIGIT_ONE_THRU_NINE [ one {return(1)} VSUB_DIGIT_TWO_THRU_NINE:n {return($n)} ] VSUB_DIGIT [ [ zero oh ] {return(0)} VSUB_DIGIT_ONE_THRU_NINE:n {return($n)} ] ; Single-digit grammars that return string values VSUB_DIGIT_TWO_THRU_NINE_STRING [ two {return("2")} three {return("3")} four {return("4")} five {return("5")} six {return("6")} seven {return("7")} eight {return("8")} nine {return("9")} ] VSUB_DIGIT_ONE_THRU_NINE_STRING [ one {return("1")} VSUB_DIGIT_TWO_THRU_NINE_STRING:n {return($n)} ] VSUB_DIGIT_STRING [ [ zero oh ] {return("0")} VSUB_DIGIT_ONE_THRU_NINE_STRING:n {return($n)} ] VSUB_TEEN_STRING [ eleven {return("11")} twelve {return("12")} thirteen {return("13")} fourteen {return("14")} fifteen {return("15")} sixteen {return("16")} seventeen {return("17")} eighteen {return("18")} nineteen {return("19")} ] VSUB_DECADE_STRING [ twenty {return("2")} thirty {return("3")} forty {return("4")} fifty {return("5")} sixty {return("6")} seventy {return("7")} eighty {return("8")} ninety {return("9")} ] VSUB_TEEN [ eleven {return(11)} twelve {return(12)} thirteen {return(13)} fourteen {return(14)} fifteen {return(15)} sixteen {return(16)} seventeen {return(17)} eighteen {return(18)} nineteen {return(19)} ] VSUB_DECADE [ twenty {return(20)} thirty {return(30)} forty {return(40)} fifty {return(50)} sixty {return(60)} seventy {return(70)} eighty {return(80)} ninety {return(90)} ]