FLIGHT_NUM [ VLIB_FLIGHT_NUMBER:z {} ] VLIB_FLIGHT_NUMBER ( ?( flight ?number ) [ ; one digit with leading zeros ( [ double triple ( ?zero zero ) ( ?oh oh ) ] [ zero oh ] VSUB_DIGIT_ONE_THRU_NINE_STRING:n ) {return($n)} ; two digits with leading zeros ( ?[ double zero oh ] [ zero oh ] [ ( VSUB_DIGIT_ONE_THRU_NINE_STRING:t VSUB_DIGIT_STRING:u ) {return(strcat($t $u))} VSUB_FLIGHT_NUMBER_10_THRU_99:n {return($n)} ] ) ; three digits with leading zero ( [ zero oh ] VSUB_DIGIT_ONE_THRU_NINE_STRING:h hundred ) {return(strcat($h "00"))} ( [ zero oh ] VSUB_DIGIT_ONE_THRU_NINE_STRING:h VSUB_DIGIT_STRING:t VSUB_DIGIT_STRING:u ) {return(strcat($h strcat($t $u)))} ; one digit without leading zeros VSUB_DIGIT_STRING:n {return($n)} ; two digits without leading zeros VSUB_FLIGHT_NUMBER_10_THRU_99:n {return($n)} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:t VSUB_DIGIT_STRING:u ) {return(strcat($t $u))} ; three digits without leading zero ( VSUB_DIGIT_ONE_THRU_NINE_STRING:h hundred ) {return(strcat($h "00"))} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:h ?( hundred ?and ) VSUB_FLIGHT_NUMBER_10_THRU_99:u ) {return(strcat($h $u))} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:h [ ( hundred ?and ) zero oh ] VSUB_DIGIT_ONE_THRU_NINE_STRING:u ) {return(strcat($h strcat("0" $u)))} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:h VSUB_DIGIT_STRING:t VSUB_DIGIT_STRING:u ) {return(strcat($h strcat($t $u)))} ; four digits ( VSUB_DIGIT_ONE_THRU_NINE_STRING:k thousand ) {return(strcat($k "000"))} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:k thousand ?and VSUB_FLIGHT_NUMBER_10_THRU_99:u ) {return(strcat(strcat($k "0") $u))} ( VSUB_FLIGHT_NUMBER_10_THRU_99:a VSUB_FLIGHT_NUMBER_THRU_99_WITH_OH:b ) {return(strcat($a $b))} ( VSUB_TEEN_STRING:a hundred ) {return(strcat($a "00"))} ( VSUB_DECADE_STRING:k VSUB_DIGIT_ONE_THRU_NINE_STRING:h hundred ) {return(strcat(strcat($k $h) "00"))} ( VSUB_TEEN_STRING:a hundred ?and VSUB_FLIGHT_NUMBER_1_THRU_99:b ) {return(strcat($a $b))} ( VSUB_DECADE_STRING:k VSUB_DIGIT_ONE_THRU_NINE_STRING:h hundred ?and VSUB_FLIGHT_NUMBER_1_THRU_99:u ) {return(strcat(strcat($k $h) $u))} ( VSUB_DIGIT_ONE_THRU_NINE_STRING:k VSUB_DIGIT_STRING:h VSUB_DIGIT_STRING:t VSUB_DIGIT_STRING:u ) {return(strcat(strcat($k $h) strcat($t $u)))} ] ) VSUB_FLIGHT_NUMBER_10_THRU_99 [ ten {return("10")} VSUB_TEEN_STRING:t {return($t)} VSUB_DECADE_STRING:t {return(strcat($t "0"))} ( VSUB_DECADE_STRING:t VSUB_DIGIT_ONE_THRU_NINE_STRING:u ) {return(strcat($t $u))} ] VSUB_FLIGHT_NUMBER_1_THRU_99 [ VSUB_FLIGHT_NUMBER_10_THRU_99:n {return($n)} VSUB_DIGIT_ONE_THRU_NINE_STRING:n {return(strcat("0" $n))} ] VSUB_FLIGHT_NUMBER_THRU_99_WITH_OH [ VSUB_FLIGHT_NUMBER_10_THRU_99:n {return($n)} ( oh VSUB_DIGIT_ONE_THRU_NINE:n ) {return(strcat("0" $n))} ] 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)} ]