|
|
<GRAMMAR LANGID="409"> <DEFINE> <ID NAME="BILLIONS" VAL="1"/> <ID NAME="MILLIONS" VAL="2"/> <ID NAME="THOUSANDS" VAL="3"/> <ID NAME="HUNDREDS" VAL="4"/> <ID NAME="TENS" VAL="5"/> <ID NAME="ONES" VAL="6"/> <ID NAME="NEGATIVE" VAL="7"/> <ID NAME="MILLBILL" VAL="8"/> <ID NAME="DIGIT" VAL="9"/> <ID NAME="TWODIGIT" VAL="10"/> <ID NAME="FP_PART" VAL="11"/> <ID NAME="ZERO" VAL="12"/> <ID NAME="POINT_ZERO" VAL="13"/> <ID NAME="NUMERATOR" VAL="14"/> <ID NAME="DENOMINATOR" VAL="15"/> <ID NAME="WHOLE" VAL="16"/> <ID NAME="ONEDIGIT" VAL="17"/>
<ID NAME="DAY_OF_WEEK" VAL="30"/> <ID NAME="DAY_OF_MONTH" VAL="31"/> <ID NAME="MONTH" VAL="32"/> <ID NAME="YEAR" VAL="33"/> <ID NAME="TWOTHOUSAND" VAL="34"/> <ID NAME="DATE_HUNDREDS" VAL="35"/> <ID NAME="YEARMONTH" VAL="36"/> <ID NAME="MONTHYEAR" VAL="37"/>
<ID NAME="QUARTER_TO" VAL="40"/> <ID NAME="QUARTER_PAST" VAL="41"/> <ID NAME="HALF_PAST" VAL="42"/> <ID NAME="CLOCKTIME_QUALIFIER" VAL="43"/> <ID NAME="HOUR_CLOCK" VAL="44"/> <ID NAME="HOUR_COUNT" VAL="45"/> <ID NAME="MINUTE" VAL="46"/> <ID NAME="SECOND" VAL="47"/> <ID NAME="AMPM" VAL="50"/> <ID NAME="AM" VAL="51"/> <ID NAME="PM" VAL="52"/>
<ID NAME="US_STATE" VAL="60"/> <ID NAME="ZIPCODE" VAL="61"/> <ID NAME="CAN_PROVINCE" VAL="62"/> <ID NAME="ALPHA" VAL="63"/> <ID NAME="FOURDIGITS" VAL="64"/> <ID NAME="COMMA" VAL="65"/>
<ID NAME="ONE_PLUS" VAL="70"/> <ID NAME="AREA_CODE" VAL="71"/> <ID NAME="PHONENUM_EXCHANGE" VAL="72"/> <ID NAME="EXTENSION" VAL="73"/>
<ID NAME="TEMP_UNITS" VAL="80"/> <ID NAME="DIRECTION" VAL="81"/>
<ID NAME="UNITS" VAL="90"/> <ID NAME="NUMBER" VAL="91"/>
<ID NAME="CURRENCY_TYPE" VAL="100"/> <ID NAME="DOLLARS" VAL="101"/> <ID NAME="CENTS" VAL="102"/> <ID NAME="CURRENCY_SMALL_TYPE" VAL="103"/>
<ID NAME="GRID_INTEGER_99" VAL="1001"/> <ID NAME="GRID_INTEGER_999" VAL="1002"/> <ID NAME="GRID_INTEGER_MILLBILL" VAL="1003"/> <ID NAME="GRID_INTEGER_STANDALONE" VAL="1004"/> <ID NAME="GRID_INTEGER" VAL="1005"/> <ID NAME="GRID_INTEGER_NONNEG" VAL="1006"/> <ID NAME="GRID_DIGIT_NUMBER" VAL="1007"/> <ID NAME="GRID_FP_NUMBER" VAL="1008"/> <ID NAME="GRID_FP_NUMBER_NONNEG" VAL="1009"/> <ID NAME="GRID_ORDINAL" VAL="1010"/> <ID NAME="GRID_DENOMINATOR_SINGULAR" VAL="1011"/> <ID NAME="GRID_DENOMINATOR" VAL="1012"/> <ID NAME="GRID_FRACTION" VAL="1013"/> <ID NAME="GRID_DATE" VAL="1014"/> <ID NAME="GRID_YEAR" VAL="1015"/> <ID NAME="GRID_TIME" VAL="1016"/> <ID NAME="GRID_MINSEC" VAL="1017"/> <ID NAME="GRID_CLOCK_MINSEC" VAL="1018"/> <ID NAME="GRID_STATEZIP" VAL="1019"/> <ID NAME="GRID_ZIPCODE" VAL="1020"/> <ID NAME="GRID_CAN_ZIPCODE" VAL="1021"/> <ID NAME="GRID_ZIP_PLUS_FOUR" VAL="1022"/> <ID NAME="GRID_PHONE_NUMBER" VAL="1023"/> <ID NAME="GRID_DEGREES" VAL="1024"/> <ID NAME="GRID_MEASUREMENT" VAL="1025"/> <ID NAME="GRID_CURRENCY" VAL="1026"/> <ID NAME="GRID_CENTS" VAL="1027"/> <ID NAME="COMMON_GRID_MEASURMEMENT" VAL="1028"/> </DEFINE>
<!--
GRID_PHONE_NUMBER Needs to precede GRID_INTEGER so that if there is any ambiguity we will fire this rule. A phone number is an optional area code, three digits, four digits, and an optional extension number --> <RULE NAME="GRID_PHONE_NUMBER" ID="GRID_PHONE_NUMBER" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <O> <O> <RULEREF NAME="one_plus" PROPNAME="ONE_PLUS" PROPID="ONE_PLUS"/> </O> <P> <RULEREF NAME="area_code" PROPNAME="AREA_CODE" PROPID="AREA_CODE"/> </P> <O> <RULEREF NAME="dash_slash"/> </O> </O> <P> <RULEREF NAME="three_digits_phone" PROPNAME="PHONENUM_EXCHANGE" PROPID="PHONENUM_EXCHANGE"/> </P> <O> <RULEREF NAME="dash_slash"/> </O> <P> <RULEREF NAME="four_digits" PROPNAME="FOURDIGITS" PROPID="FOURDIGITS"/> </P> <O> <L> <P> ext. </P> <P> extension </P> <P> X. </P> </L> <P> <RULEREF NAME="extension" PROPNAME="EXTENSION" PROPID="EXTENSION"/> </P> </O> </RULE>
<!--
INTEGER_99 Numbers in [0, 100) Toplevel inactive but can be imported --> <RULE NAME="GRID_INTEGER_99" ID="GRID_INTEGER_99" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="cardinal_99" PROPNAME="ONES" PROPID="ONES"/> </RULE>
<!--
INTEGER_999 Numbers in [0, 1000) Toplevel inactive but can be imported --> <RULE NAME="GRID_INTEGER_999" ID="GRID_INTEGER_999" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="cardinal_999" PROPNAME="ONES" PROPID="ONES"/> </RULE>
<!--
INTEGER_MILLBILL Numbers for which the word "million" or "billion" should be displayed --> <RULE NAME="GRID_INTEGER_MILLBILL" ID="GRID_INTEGER_MILLBILL" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <RULEREF NAME="GRID_INTEGER_99" PROPNAME="GRID_INTEGER_99" PROPID="GRID_INTEGER_99"/> </P> <P> <RULEREF NAME="GRID_FP_NUMBER_NONNEG" PROPNAME="GRID_FP_NUMBER_NONNEG" PROPID="GRID_FP_NUMBER_NONNEG"/> </P> </L> <L PROPNAME="MILLBILL" PROPID="MILLBILL"> <P VAL="MILLIONS" VALSTR="million">million</P> <P VAL="BILLIONS" VALSTR="billion">billion</P> </L> </RULE> <!-- Removed ID="GRID_INTEGER_MILLBILL" --> <RULE NAME="GRID_INTEGER_20_MILLBILL" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <RULEREF NAME="cardinal_20_999" PROPNAME="GRID_INTEGER_99" PROPID="GRID_INTEGER_99"/> </P> <P> <RULEREF NAME="GRID_FP_NUMBER_NONNEG" PROPNAME="GRID_FP_NUMBER_NONNEG" PROPID="GRID_FP_NUMBER_NONNEG"/> </P> </L> <L PROPNAME="MILLBILL" PROPID="MILLBILL"> <P VAL="MILLIONS" VALSTR="million">million</P> <P VAL="BILLIONS" VALSTR="billion">billion</P> </L> </RULE>
<!--
INTEGER_STANDALONE A INTEGER_STANDALONE can be in the range (-1e12, 1e12) and will always be called as a toplevel rule. This rule is not referenced by any other rules. --> <RULE NAME="GRID_INTEGER_STANDALONE" ID="GRID_INTEGER_STANDALONE" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <L> <P> <O> <RULEREF NAME="NEGATIVE" PROPNAME="NEGATIVE" PROPID="NEGATIVE"/> </O> <P> <RULEREF NAME="GRID_INTEGER_MILLBILL" PROPNAME="GRID_INTEGER_MILLBILL" PROPID="GRID_INTEGER_MILLBILL"/> </P> </P> <P> <RULEREF NAME="integer_base"/> </P> </L> </RULE>
<!--
INTEGER A INTEGER can be in the range (-1e12, 1e12) and will never be called as a toplevel rule --> <RULE NAME="GRID_INTEGER" ID="GRID_INTEGER" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="integer_base"/> </RULE>
<!--
INTEGER_NONNEG A INTEGER_NONNEG can be in the range [0, 1e12) and will never be called as a toplevel rule --> <RULE NAME="GRID_INTEGER_NONNEG" ID="GRID_INTEGER_NONNEG" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="integer_base_nonneg"/> </RULE>
<!--
DIGIT_NUMBER Integers in (0, 1e12), spelled out either one digit at a time or two digits at a time. This rule is an INACTIVE toplevel rule, since it should go through GRID_INTEGER to be formatted. Explicitly disallow TWODIGIT DIGIT since that is ambiguous with "twenty five" --> <RULE NAME="GRID_DIGIT_NUMBER" ID="GRID_DIGIT_NUMBER" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P MIN="3" MAX="12"> <L> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P> <RULEREF NAME="digit" PROPNAME="ONEDIGIT" PROPID="ONEDIGIT"/> </P> </L> </P> <P> <P> <RULEREF NAME="digit" PROPNAME="ONEDIGIT" PROPID="ONEDIGIT"/> </P> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> </P> <P MIN="2" MAX="2"> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P MIN="2" MAX="2"> <RULEREF NAME="digit" PROPNAME="ONEDIGIT" PROPID="ONEDIGIT"/> </P> </L> </RULE>
<!--
FP_NUMBER Floating-point numbers with up to 12 sig figs. Both the stuff to the left of the decimal point and the stuff to the right of the decimal point can be either NUMBERs or DIGIT_NUMBERs --> <RULE NAME="GRID_FP_NUMBER" ID="GRID_FP_NUMBER" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="1"> <O> <RULEREF NAME="NEGATIVE" PROPNAME="NEGATIVE" PROPID="NEGATIVE"/> </O> <P> <RULEREF NAME="fp_number_nonneg"/> </P> </RULE>
<RULE NAME="GRID_FP_NUMBER_NONNEG" ID="GRID_FP_NUMBER_NONNEG" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="fp_number_nonneg"/> </RULE>
<!--
ORDINAL Ordinal numbers from "zeroth" to "999,999,999,999th" Not a toplevel rule; will fire only as part of another rule --> <RULE NAME="GRID_ORDINAL" ID="GRID_ORDINAL" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <!-- If a cardinal big_part is there, the ordinal ending must be there --> <O> <RULEREF NAME="big_part"/> </O> <P> <RULEREF NAME="ordinal_999" PROPNAME="ONES" PROPID="ONES"/> </P> </P> <P> <!--Something like "three thousandth"--> <RULEREF NAME="big_part_ord"/> </P> </L> </RULE>
<!--
DENOMINATOR_SINGULAR Almost exactly the same as an ORDINAL, but "half" replaces "second" --> <RULE NAME="GRID_DENOMINATOR_SINGULAR" ID="GRID_DENOMINATOR_SINGULAR" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <O> <RULEREF NAME="big_part"/> </O> <P> <RULEREF NAME="ordinal_999_den_singular" PROPNAME="ONES" PROPID="ONES"/> </P> </P> <P> <RULEREF NAME="big_part_ord"/> </P> </L> </RULE>
<!--
DENOMINATOR Almost exactly the same as ORDINALs. The only difference is the plural ("thirds" instead of "third") --> <RULE NAME="GRID_DENOMINATOR" ID="GRID_DENOMINATOR" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <O> <RULEREF NAME="big_part"/> </O> <P> <RULEREF NAME="ordinal_999_den" PROPNAME="ONES" PROPID="ONES"/> </P> </P> <P> <RULEREF NAME="big_part_ord_den"/> </P> </L> </RULE>
<!--
FRACTION Can be expressed as either "three over four" or "three fourths". Numerator and denominator both are allowed to be in the range (-1e12, 1e12). The ITN-interpreting code must be prepared to handle zero denominators. --> <RULE NAME="GRID_FRACTION" ID="GRID_FRACTION" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="1"> <O> <!-- Optional whole part --> <RULEREF NAME="GRID_INTEGER" PROPNAME="WHOLE" PROPID="WHOLE"/> <P> and </P> </O> <L> <P> <L> <P> <RULEREF NAME="GRID_INTEGER" PROPNAME="NUMERATOR" PROPID="NUMERATOR"/> </P> <P> <RULEREF NAME="GRID_DIGIT_NUMBER" PROPNAME="NUMERATOR" PROPID="NUMERATOR"/> </P> <P PROPNAME="ZERO" PROPID="ZERO" VAL="0"> oh </P> </L> <L> <P> over </P> <P> ?forward slash </P> </L> <L> <P> <RULEREF NAME="GRID_INTEGER" PROPNAME="DENOMINATOR" PROPID="DENOMINATOR"/> </P> <P> <RULEREF NAME="GRID_DIGIT_NUMBER" PROPNAME="DENOMINATOR" PROPID="DENOMINATOR"/> </P> </L> </P> <P> <L> <P> <P> <RULEREF NAME="GRID_INTEGER" PROPNAME="NUMERATOR" PROPID="NUMERATOR"/> </P> <P> <RULEREF NAME="GRID_DENOMINATOR" PROPNAME="DENOMINATOR" PROPID="DENOMINATOR"/> </P> </P> <P> <P> one </P> <P> <RULEREF NAME="GRID_DENOMINATOR_SINGULAR" PROPNAME="GRID_DENOMINATOR_SINGULAR" PROPID="DENOMINATOR"/> </P> </P> </L> </P> </L> </RULE>
<!--
DATE Spoken dates. --> <RULE NAME="GRID_DATE" ID="GRID_DATE" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <L> <P> <O> <RULEREF NAME="day_of_week"/> </O> <L> <P> <RULEREF NAME="month"/> <RULEREF NAME="day_of_month"/> </P> <P> <RULEREF NAME="day_of_month"/> <RULEREF NAME="month_capital_necessary"/> </P> </L> <O> <RULEREF NAME="GRID_YEAR" PROPNAME="YEAR" PROPID="YEAR"/> </O> </P> <P> <RULEREF NAME="month_year" PROPNAME="MONTHYEAR" PROPID="MONTHYEAR"/> </P> <P> <RULEREF NAME="year_month" PROPNAME="YEARMONTH" PROPID="YEARMONTH"/> </P> </L> </RULE>
<!--
YEAR Spoken year. --> <RULE NAME="GRID_YEAR" ID="GRID_YEAR" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <O> <P> hundred </P> <O> and </O> </O> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> </P> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P MIN="4" MAX="4"> <RULEREF NAME="digit" PROPNAME="ONEDIGIT" PROPID="ONEDIGIT"/> </P> <P> <P PROPNAME="TWOTHOUSAND" PROPID="TWOTHOUSAND" VAL="2000"> two thousand </P> <O> <O> and </O> <L> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P> <RULEREF NAME="digit" PROPNAME="ONEDIGIT" PROPID="ONEDIGIT"/> </P> </L> </O> </P> <!--
<P> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P PROPNAME="DATE_HUNDREDS" PROPID="DATE_HUNDREDS" VAL="100"> hundred </P> </P> --> <P> <RULEREF NAME="date_hundreds" PROPNAME="DATE_HUNDREDS" PROPID="DATE_HUNDREDS"/> </P> </L> </RULE>
<!--
TIME Spoken time. --> <RULE NAME="GRID_TIME" ID="GRID_TIME" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <L> <P> <P> <RULEREF NAME="clock_hour"/> </P> <P> o'clock </P> <O> <RULEREF NAME="am_pm"/> </O> </P> <P> <P> <RULEREF NAME="clock_hour"/> </P> <O> <RULEREF NAME="GRID_CLOCK_MINSEC" PROPNAME="MINUTE" PROPID="MINUTE"/> </O> <P> <RULEREF NAME="am_pm"/> </P> </P> <P> <P> <RULEREF NAME="GRID_INTEGER_999" PROPNAME="HOUR_COUNT" PROPID="HOUR_COUNT"/> </P> <L> <P> hours </P> <P> hour </P> </L> <O> and </O> <L> <P> <P> <RULEREF NAME="GRID_MINSEC" PROPNAME="MINUTE" PROPID="MINUTE"/> </P> <L> <P> minutes </P> <P> minute </P> </L> <O> <O> and </O> <P> <RULEREF NAME="GRID_MINSEC" PROPNAME="SECOND" PROPID="SECOND"/> </P> <L> <P> seconds </P> <P> second </P> </L> </O> </P> <P> <P> <RULEREF NAME="GRID_MINSEC" PROPNAME="SECOND" PROPID="SECOND"/> </P> <L> <P> seconds </P> <P> second </P> </L> </P> </L> </P> <P> <O> a </O> <P> <RULEREF NAME="clocktime_qualifier"/> </P> <P> <RULEREF NAME="clock_hour"/> </P> </P> </L> </RULE>
<!--
GRID_MINSEC Formed as a properly-formed number --> <RULE NAME="GRID_MINSEC" ID="GRID_MINSEC" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <P> <RULEREF NAME="minutes" PROPNAME="ONES" PROPID="ONES"/> </P> </RULE>
<!--
GRID_CLOCK_MINSEC Formed as a properly-formed number --> <RULE NAME="GRID_CLOCK_MINSEC" ID="GRID_CLOCK_MINSEC" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <P> <RULEREF NAME="clock_minutes" PROPNAME="ONES" PROPID="ONES"/> </P> </RULE>
<!--
GRID_STATEZIP Names of US states and territories are ITNed only if followed by a zip code. --> <RULE NAME="GRID_STATEZIP" ID="GRID_STATEZIP" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <O> <RULEREF NAME="comma" PROPNAME="COMMA" PROPID="COMMA"/> </O> <L> <P> <P> <RULEREF NAME="us_state"/> </P> <P> <RULEREF NAME="GRID_ZIPCODE" PROPNAME="ZIPCODE" PROPID="ZIPCODE"/> </P> <O> <O> <RULEREF NAME="dash_slash"/> </O> <P> <RULEREF NAME="GRID_ZIP_PLUS_FOUR" PROPNAME="FOURDIGITS" PROPID="FOURDIGITS"/> </P> </O> </P> <P> <P> <RULEREF NAME="can_province"/> </P> <P> <RULEREF NAME="GRID_CAN_ZIPCODE" PROPNAME="ZIPCODE" PROPID="ZIPCODE"/> </P> </P> </L> </RULE>
<!--
GRID_ZIPCODE Five digits, evaluated as a GRID_DIGIT_NUMBER --> <RULE NAME="GRID_ZIPCODE" ID="GRID_ZIPCODE" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <P MIN="5" MAX="5"> <RULEREF NAME="digit"/> </P> </RULE>
<!--
GRID_CAN_ZIPCODE Alpha/Number/Alpha Number/Alpha/Number. Those wacky canooks --> <RULE NAME="GRID_CAN_ZIPCODE" ID="GRID_CAN_ZIPCODE" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <P MIN="3" MAX="3"> <P> <RULEREF NAME="alpha"/> </P> <P> <RULEREF NAME="digit"/> </P> </P> </RULE>
<!--
GRID_ZIP_PLUS_FOUR Four digits --> <RULE NAME="GRID_ZIP_PLUS_FOUR" ID="GRID_ZIP_PLUS_FOUR" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <RULEREF NAME="four_digits"/> </RULE>
<!--
GRID_DEGREES Number and then the word "degree(s)" Uses context to figure out what kind of degrees: * Temperature: Fahrenheit or Celsius * Angle measurement: optional minutes or seconds * Directions: followed by NESW --> <RULE NAME="GRID_DEGREES" ID="GRID_DEGREES" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <L> <P> <P> <RULEREF NAME="number_all"/> </P> <P> <RULEREF NAME="degrees"/> </P> <O> <RULEREF NAME="temp_units"/> </O> </P> <P> <P> <RULEREF NAME="GRID_INTEGER_NONNEG" PROPNAME="GRID_INTEGER_NONNEG" PROPID="GRID_INTEGER_NONNEG"/> </P> <P> <RULEREF NAME="degrees"/> </P> <O> <O> and </O> <P> <RULEREF NAME="GRID_MINSEC" PROPNAME="MINUTE" PROPID="MINUTE"/> </P> <L> <P> minutes </P> <P> minute </P> </L> </O> <O> <O> and </O> <P> <RULEREF NAME="GRID_MINSEC" PROPNAME="SECOND" PROPID="SECOND"/> </P> <L> <P> seconds </P> <P> second </P> </L> </O> <O> <RULEREF NAME="direction"/> </O> </P> </L> </RULE>
<!--
GRID_MEASUREMENT Any sort of number (NUMBER, FLOAT, or FRACTION) followed by a unit --> <RULE NAME="GRID_MEASUREMENT" ID="GRID_MEASUREMENT" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0"> <L> <P> <RULEREF NAME="GRID_FP_NUMBER" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_INTEGER" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_FRACTION" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> </L> <L> <P> <RULEREF NAME="units"/> </P> <P> <RULEREF NAME="commonunits"/> </P> </L> </RULE>
<!-- <RULE NAME="COMMON_GRID_MEASUREMENT" ID="COMMON_GRID_MEASURMEMENT" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="0">
<L> <P> <RULEREF NAME="GRID_FP_NUMBER" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_INTEGER_20_MILLBILL" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_FRACTION" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> </L>
<P> <RULEREF NAME="commonunits"/> </P> </RULE>-->
<!--
CURRENCY Allows for dollars and optional cents, just cents, or a floating-point number of dollars. --> <RULE NAME="GRID_CURRENCY" ID="GRID_CURRENCY" INTERPRETER="1" TOPLEVEL="ACTIVE" EXPORT="1"> <L> <P> <O> <RULEREF NAME="NEGATIVE" PROPNAME="NEGATIVE" PROPID="NEGATIVE"/> </O> <L> <P> <P> <RULEREF NAME="GRID_INTEGER_NONNEG" PROPNAME="DOLLARS" PROPID="DOLLARS"/> </P> <P> <RULEREF NAME="currency_type"/> </P> <O> currency </O> <O> <O> and </O> <P> <RULEREF NAME="GRID_CENTS" PROPNAME="CENTS" PROPID="CENTS"/> </P> <O> <RULEREF NAME="currency_small_type"/> </O> </O> </P> <P> <P> <RULEREF NAME="GRID_INTEGER_NONNEG" PROPNAME="DOLLARS" PROPID="DOLLARS"/> </P> <P> and </P> <P> <RULEREF NAME="GRID_CENTS" PROPNAME="CENTS" PROPID="CENTS"/> </P> <P> <RULEREF NAME="currency_small_type"/> </P> </P> <P> <P> <RULEREF NAME="GRID_INTEGER_MILLBILL" PROPNAME="DOLLARS" PROPID="DOLLARS"/> </P> <P> <RULEREF NAME="currency_type"/> </P> </P> </L> </P> <P> <P> <RULEREF NAME="GRID_INTEGER_NONNEG" PROPNAME="CENTS" PROPID="CENTS"/> </P> <P> <RULEREF NAME="currency_small_type"/> </P> </P> <P> <P> <RULEREF NAME="GRID_FP_NUMBER" PROPNAME="DOLLARS" PROPID="DOLLARS"/> </P> <P> <RULEREF NAME="currency_type"/> </P> </P> <P> <P> <RULEREF NAME="GRID_FP_NUMBER_NONNEG" PROPNAME="CENTS" PROPID="CENTS"/> </P> <P> <RULEREF NAME="currency_small_type"/> </P> </P> </L> </RULE>
<RULE NAME="GRID_CENTS" ID="GRID_CENTS" INTERPRETER="1" TOPLEVEL="INACTIVE" EXPORT="1"> <L> <P> <RULEREF NAME="digit"/> </P> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> </L> </RULE>
<!-- ************************************************************************
CARDINAL QUANTITIES ************************************************************************ -->
<!--
integer_base The rule referenced by the number rules above --> <RULE NAME="integer_base"> <O> <RULEREF NAME="NEGATIVE" PROPNAME="NEGATIVE" PROPID="NEGATIVE"/> </O> <P> <RULEREF NAME="integer_base_nonneg"/> </P> </RULE>
<!--
integer_base_nonneg Same as above except nonnegative --> <RULE NAME="integer_base_nonneg"> <L> <P> <RULEREF NAME="cardinal"/> </P> <P> <RULEREF NAME="GRID_DIGIT_NUMBER" PROPNAME="GRID_DIGIT_NUMBER" PROPID="GRID_DIGIT_NUMBER"/> </P> </L> </RULE>
<!--
cardinal A cardinal is defined here as a number in [0, 1e12), properly formed (not spoken digit by digit) --> <RULE NAME="cardinal"> <L> <P> <L> <P> <RULEREF NAME="big_part"/> </P> </L>
<O> <O> and </O> <P> <!-- cardinal_999 part optional if the big_part is present --> <RULEREF NAME="cardinal_999" PROPNAME="ONES" PROPID="ONES" VAL="1"/> </P> </O> </P> <P> <P> <RULEREF NAME="cardinal_99_nonzero" PROPNAME="HUNDREDS" PROPID="HUNDREDS" VAL="1"/> </P> <P> hundred </P> <O> <O> and </O> <P> <RULEREF NAME="cardinal_99_nonzero" PROPNAME="ONES" PROPID="ONES" VAL="1"/> </P> </O> </P> <P> <!-- cardinal_999 part mandatory if the big_part is not present.
In this case, the cardinal_999 part must be at least 20 --> <RULEREF NAME="cardinal_999" PROPNAME="ONES" PROPID="ONES" VAL="1"/> </P> </L> </RULE>
<!--
big_part A big_part is the part of a spoken number that is divisible by 1000. It has to be in the range (-1e12, 1e12). --> <RULE NAME="big_part"> <L> <P> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> <!-- billions are present, so millions and thousands are optional --> <O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousand </P> </O> </P> <P> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> <!-- millions are present, so thousands are optional --> <O> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousand </P> </O> </P> <P> <!-- billions and millions not present, so thousands are mandatory --> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousand </P> </P> </L> </RULE>
<!--
cardinal_999 This is defined as a number in [0,1000). --> <RULE NAME="cardinal_999"> <L> <P PROPNAME="ZERO" PROPID="ZERO" VAL="0"> zero </P> <P> <!-- A number between 1 and 19 --> <RULEREF NAME="onesfrag" PROPNAME="ONES" VAL="1"/> </P> <P> <!-- A "tens" number (20, 30,...) --> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> <O> <!-- Can be followed by a nonzero digit --> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> <P> <!-- A number at least 100 --> <RULEREF NAME="hundredsfrag" PROPNAME="HUNDREDS" VAL="100"/> <!-- optionally followed by tens and ones places --> <O> <L> <P> <!-- e.g. six hundred thirteen --> <!-- Note that this case is not covered by the later case --> <RULEREF NAME="onesfrag" PROPNAME="ONES" VAL="1"/> </P> <P> <!-- e.g. six hundred thirty two --> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> <O> <!-- ones place optional --> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> </L> </O> </P> </L> </RULE> <RULE NAME="cardinal_20_999"> <L> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> <O> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> <P> <RULEREF NAME="hundredsfrag" PROPNAME="HUNDREDS" VAL="100"/> <O> <L> <P> <RULEREF NAME="onesfrag" PROPNAME="ONES" VAL="1"/> </P> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> <O> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> </L> </O> </P> </L> </RULE>
<!--
cardinal_99 Defined as any integer in [0,100) --> <RULE NAME="cardinal_99"> <L> <P> <RULEREF NAME="cardinal_99_nonzero"/> </P> <P> <RULEREF NAME="zero"/> </P> </L> </RULE>
<RULE NAME="cardinal_99_nonzero"> <L> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> <O><RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/></O> </P> <P> <RULEREF NAME="onesfrag" PROPNAME="ONES" VAL="1"/> </P> </L> </RULE>
<RULE NAME="NEGATIVE"> <L> <P> negative </P> <P> minus </P> </L> </RULE>
<RULE NAME="twodigit"> <L> <P> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <O> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> <P> <RULEREF NAME="onesfrag_teens" PROPNAME="ONES" VAL="1"/> </P> <P> <L> <P> zero </P> <P> oh </P> </L> <P> <RULEREF NAME="digit" PROPNAME="ONES" VAL="1"/> </P> </P> </L> </RULE>
<RULE NAME="hundredsfrag"> <L> <L PROPNAME="HUNDREDS" PROPID="HUNDREDS"> <P VAL="1" VALSTR="1">a</P> </L> <P> <RULEREF NAME="digit_nonzero"/> </P> </L> <P> hundred ?and </P> </RULE>
<RULE NAME="tensfrag"> <L PROPNAME="TENS" PROPID="TENS"> <P VAL="2" VALSTR="2">twenty</P> <P VAL="3" VALSTR="3">thirty</P> <P VAL="4" VALSTR="4">forty</P> <P VAL="5" VALSTR="5">fifty</P> <P VAL="6" VALSTR="6">sixty</P> <P VAL="7" VALSTR="7">seventy</P> <P VAL="8" VALSTR="8">eighty</P> <P VAL="9" VALSTR="9">ninety</P> </L> </RULE>
<RULE NAME="onesfrag"> <L> <P> <RULEREF NAME="digit_nonzero"/> </P> <P> <RULEREF NAME="onesfrag_teens"/> </P> </L> </RULE>
<RULE NAME="onesfrag_teens"> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="10" VALSTR="10">ten</P> <P VAL="11" VALSTR="11">eleven</P> <P VAL="12" VALSTR="12">twelve</P> <P VAL="13" VALSTR="13">thirteen</P> <P VAL="14" VALSTR="14">fourteen</P> <P VAL="15" VALSTR="15">fifteen</P> <P VAL="16" VALSTR="16">sixteen</P> <P VAL="17" VALSTR="17">seventeen</P> <P VAL="18" VALSTR="18">eighteen</P> <P VAL="19" VALSTR="19">nineteen</P> </L> </RULE>
<RULE NAME="onesfrag_or_zero"> <L> <P> <RULEREF NAME="zero"/> </P> <P> <RULEREF NAME="onesfrag"/> </P> </L> </RULE>
<RULE NAME="digit_nonzero_or_one"> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="2" VALSTR="2">two</P> <P VAL="3" VALSTR="3">three</P> <P VAL="4" VALSTR="4">four</P> <P VAL="5" VALSTR="5">five</P> <P VAL="6" VALSTR="6">six</P> <P VAL="7" VALSTR="7">seven</P> <P VAL="8" VALSTR="8">eight</P> <P VAL="9" VALSTR="9">nine</P> </L> </RULE>
<RULE NAME="digit_nonzero"> <L> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="1" VALSTR="1">one</P> </L> <P> <RULEREF NAME="digit_nonzero_or_one"/> </P> </L> </RULE>
<RULE NAME="digit"> <L> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="0" VALSTR="0">zero</P> <P VAL="0" VALSTR="0">oh</P> </L> <P> <RULEREF NAME="digit_nonzero"/> </P> </L> </RULE>
<RULE NAME="zero"> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="0" VALSTR="0">zero</P> </L> </RULE>
<!-- ************************************************************************
ORDINAL QUANTITIES ************************************************************************ -->
<!--
big_part_ord This is when the ordinal number ends in something divisible by 100, so the last word will be either "billionth", "millionth", "thousandth", or "hundredth" --> <RULE NAME="big_part_ord"> <L> <P> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billionth </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> millionth </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> </O> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousandth </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousand </P> </O> <RULEREF NAME="cardinal_99_nonzero" PROPNAME="HUNDREDS" PROPID="HUNDREDS"/> <P> hundredth </P> </P> </L> </RULE> <!--
ordinal_999 This is an ordinal number between "zeroth" and "nine hundred ninety ninth" --> <RULE NAME="ordinal_999"> <L> <P PROPNAME="ZERO" PROPID="ZERO" VAL="0"> zeroth </P> <P> <!-- A number between 1st and 19th, or 20th, 30th, ...90th --> <RULEREF NAME="onesfrag_ord" PROPNAME="ONES" VAL="1"/> </P> <P> <!-- Something like "thirty ninth". Note that "thirtieth" would be covered above --> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord" PROPNAME="ONES" VAL="1"/> </P> </P> <P> <P> <RULEREF NAME="hundredsfrag" PROPNAME="HUNDREDS" VAL="100"/> </P> <!-- Followed by either a one-word ordinal ("twelfth") or a two-word
ordinal ("thirty ninth") --> <L> <P> <RULEREF NAME="onesfrag_ord" PROPNAME="ONES" VAL="1"/> </P> <P> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord" PROPNAME="ONES" VAL="1"/> </P> </P> </L> </P> </L> </RULE>
<!--
onesfrag_ord These are the words with which an ordinal number less than 1000 could end --> <RULE NAME="onesfrag_ord"> <L PROPNAME="ONES" PROPID="ONES"> <!--<P VAL="0">zero</P>--> <P VAL="1">first</P> <P VAL="2">second</P> <P VAL="3">third</P> <P VAL="4">fourth</P> <P VAL="5">fifth</P> <P VAL="6">sixth</P> <P VAL="7">seventh</P> <P VAL="8">eighth</P> <P VAL="9">ninth</P> <P VAL="10">tenth</P> <P VAL="11">eleventh</P> <P VAL="12">twelfth</P> <P VAL="13">thirteenth</P> <P VAL="14">fourteenth</P> <P VAL="15">fifteenth</P> <P VAL="16">sixteenth</P> <P VAL="17">seventeenth</P> <P VAL="18">eighteenth</P> <P VAL="19">nineteenth</P> <P VAL="20">twentieth</P> <P VAL="30">thirtieth</P> <P VAL="40">fortieth</P> <P VAL="50">fiftieth</P> <P VAL="60">sixtieth</P> <P VAL="70">seventieth</P> <P VAL="80">eightieth</P> <P VAL="90">ninetieth</P> </L> </RULE>
<RULE NAME="digit_nonzero_ord"> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="1">first</P> <P VAL="2">second</P> <P VAL="3">third</P> <P VAL="4">fourth</P> <P VAL="5">fifth</P> <P VAL="6">sixth</P> <P VAL="7">seventh</P> <P VAL="8">eighth</P> <P VAL="9">ninth</P> </L> </RULE>
<!-- ************************************************************************
DENOMINATOR QUANTITIES ************************************************************************ -->
<!--
big_part_ord_den Almost exactly the same as big_part_ord, except the ordinal part is plural. --> <RULE NAME="big_part_ord_den"> <L> <P> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billionths </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> millionths </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> </O> <P> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="THOUSANDS"/> <P> thousandths </P> </P> </P> <P> <O> <RULEREF NAME="cardinal_999" PROPNAME="BILLIONS" PROPID="BILLIONS"/> <P> billion </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="MILLIONS" PROPID="MILLIONS"/> <P> million </P> </O> <O> <RULEREF NAME="cardinal_999" PROPNAME="THOUSANDS" PROPID="MILLIONS"/> <P> thousand </P> </O> <P> <RULEREF NAME="cardinal_99_nonzero" PROPNAME="HUNDREDS" PROPID="HUNDREDS"/> <P> hundredths </P> </P> </P> </L> </RULE>
<!--
ordinal_999_den Same as ordinal_999, except plural, and no zeroths. --> <RULE NAME="ordinal_999_den"> <L> <P> <!-- A number between 1st and 19th, or 20th, 30th, ...90th --> <RULEREF NAME="onesfrag_ord_den_or_half_quarter" PROPNAME="ONES" VAL="1"/> </P> <P> <!-- Something like "thirty ninth". Note that "thirtieth" would be covered above --> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord_den" PROPNAME="ONES" VAL="1"/> </P> </P> <P> <P> <RULEREF NAME="hundredsfrag" PROPNAME="HUNDREDS" VAL="100"/> </P> <!-- Followed by either a one-word ordinal ("twelfth") or a two-word
ordinal ("thirty ninth") --> <L> <P> <RULEREF NAME="onesfrag_ord_den" PROPNAME="ONES" VAL="1"/> </P> <P> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord_den" PROPNAME="ONES" VAL="1"/> </P> </P> </L> </P> </L> </RULE>
<!--
ordinal_999_den_singular Same as ordinal_999_den, except all endings must be singular --> <RULE NAME="ordinal_999_den_singular"> <L> <P> <!-- A number between 1st and 19th, or 20th, 30th, ...90th --> <RULEREF NAME="onesfrag_ord_den_singular_or_half_quarter" PROPNAME="ONES" VAL="1"/> </P> <P> <!-- Something like "thirty ninth". Note that "thirtieth" would be covered above --> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord_den_singular" PROPNAME="ONES" VAL="1"/> </P> </P> <P> <P> <RULEREF NAME="hundredsfrag" PROPNAME="HUNDREDS" VAL="100"/> </P> <!-- Followed by either a one-word ordinal ("twelfth") or a two-word
ordinal ("thirty ninth") --> <L> <P> <RULEREF NAME="onesfrag_ord_den_singular" PROPNAME="ONES" VAL="1"/> </P> <P> <P> <RULEREF NAME="tensfrag" PROPNAME="TENS" VAL="10"/> </P> <P> <RULEREF NAME="digit_nonzero_ord_den_singular" PROPNAME="ONES" VAL="1"/> </P> </P> </L> </P> </L> </RULE>
<!--
onesfrag_ord_den Same as onesfrag_ord except plural. --> <RULE NAME="onesfrag_ord_den"> <L> <P> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="3">thirds</P> <P VAL="4">fourths</P> <P VAL="5">fifths</P> <P VAL="6">sixths</P> <P VAL="7">sevenths</P> <P VAL="8">eighths</P> <P VAL="9">ninths</P> <P VAL="10">tenths</P> <P VAL="11">elevenths</P> <P VAL="12">twelfths</P> <P VAL="13">thirteenths</P> <P VAL="14">fourteenths</P> <P VAL="15">fifteenths</P> <P VAL="16">sixteenths</P> <P VAL="17">seventeenths</P> <P VAL="18">eighteenths</P> <P VAL="19">nineteenths</P> <P VAL="20">twentieths</P> <P VAL="30">thirtieths</P> <P VAL="40">fortieths</P> <P VAL="50">fiftieths</P> <P VAL="60">sixtieths</P> <P VAL="70">seventieths</P> <P VAL="80">eightieths</P> <P VAL="90">ninetieths</P> </L> </P> </L> </RULE>
<RULE NAME="onesfrag_ord_den_or_half_quarter"> <L> <P> <RULEREF NAME="onesfrag_ord_den"/> </P> <P> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="2">half</P> <P VAL="4">quarter</P> <P VAL="2">halves</P> <P VAL="4">quarters</P> </L> </P> </L> </RULE>
<!--
onesfrag_ord_den_singular Same as onesfrag_ord_den except singular. --> <RULE NAME="onesfrag_ord_den_singular"> <L> <P> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="2">half</P> <P VAL="3">third</P> <P VAL="4">fourth</P> <P VAL="5">fifth</P> <P VAL="6">sixth</P> <P VAL="7">seventh</P> <P VAL="8">eighth</P> <P VAL="9">ninth</P> <P VAL="10">tenth</P> <P VAL="11">eleventh</P> <P VAL="12">twelfth</P> <P VAL="13">thirteenth</P> <P VAL="14">fourteenth</P> <P VAL="15">fifteenth</P> <P VAL="16">sixteenth</P> <P VAL="17">seventeenth</P> <P VAL="18">eighteenth</P> <P VAL="19">nineteenth</P> <P VAL="20">twentieth</P> <P VAL="30">thirtieth</P> <P VAL="40">fortieth</P> <P VAL="50">fiftieth</P> <P VAL="60">sixtieth</P> <P VAL="70">seventieth</P> <P VAL="80">eightieth</P> <P VAL="90">ninetieth</P> </L> </P> </L> </RULE>
<RULE NAME="onesfrag_ord_den_singular_or_half_quarter"> <L> <P> <RULEREF NAME="onesfrag_ord_den_singular"/> </P> <P> <L PROPNAME="ONES" PROPID="ONES"> <P VAL="2">half</P> <P VAL="4">quarter</P> </L> </P> </L> </RULE>
<RULE NAME="digit_nonzero_ord_den"> <L> <P> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="1">firsts</P> <P VAL="2">seconds</P> <P VAL="3">thirds</P> <P VAL="4">fourths</P> <P VAL="4">quarters</P> <P VAL="5">fifths</P> <P VAL="6">sixths</P> <P VAL="7">sevenths</P> <P VAL="8">eighths</P> <P VAL="9">ninths</P> </L> </P> </L> </RULE> <RULE NAME="digit_nonzero_ord_den_singular"> <L> <P> <L PROPNAME="DIGIT" PROPID="DIGIT"> <P VAL="1">first</P> <P VAL="2">second</P> <P VAL="3">third</P> <P VAL="4">fourth</P> <P VAL="5">fifth</P> <P VAL="6">sixth</P> <P VAL="7">seventh</P> <P VAL="8">eighth</P> <P VAL="9">ninth</P> </L> </P> </L> </RULE>
<!-- ************************************************************************
FLOATING-POINT NUMBER QUANTITIES ************************************************************************ --> <!--
fp_number_nonneg Floating-point numbers with up to 12 sig figs. Both the stuff to the left of the decimal point and the stuff to the right of the decimal point can be either NUMBERs or DIGIT_NUMBERs --> <RULE NAME="fp_number_nonneg"> <O> <L> <P> <RULEREF NAME="GRID_INTEGER_NONNEG" PROPNAME="ONES" PROPID="ONES"/> </P> <P PROPNAME="ZERO" PROPID="ZERO" VAL="0"> oh </P> </L> </O> <L> <P> point </P> <P> decimal </P> </L> <L> <P> <RULEREF NAME="GRID_DIGIT_NUMBER" PROPNAME="FP_PART" PROPID="FP_PART"/> </P> <P> <RULEREF NAME="GRID_INTEGER_999" PROPNAME="FP_PART" PROPID="FP_PART"/> </P> <P PROPNAME="POINT_ZERO" PROPID="POINT_ZERO" VAL="0"> oh </P> </L> </RULE>
<!-- ************************************************************************
DATE QUANTITIES ************************************************************************ --> <RULE NAME="day_of_week"> <L PROPNAME="DAY_OF_WEEK" PROPID="DAY_OF_WEEK"> <P VAL="1">Monday</P> <P VAL="2">Tuesday</P> <P VAL="3">Wednesday</P> <P VAL="4">Thursday</P> <P VAL="5">Friday</P> <P VAL="6">Saturday</P> <P VAL="7">Sunday</P> </L> </RULE>
<RULE NAME="month"> <L> <P> <RULEREF NAME="month_capital_necessary"/> </P> <P> <L PROPNAME="MONTH" PROPID="MONTH"> <P VAL="3">march</P> <P VAL="5">may</P> </L> </P> </L>
</RULE>
<RULE NAME="month_capital_necessary"> <L PROPNAME="MONTH" PROPID="MONTH"> <P VAL="1">January</P> <P VAL="2">February</P> <P VAL="3">March</P> <P VAL="4">April</P> <P VAL="5">May</P> <P VAL="6">June</P> <P VAL="7">July</P> <P VAL="8">August</P> <P VAL="9">September</P> <P VAL="10">October</P> <P VAL="11">November</P> <P VAL="12">December</P> </L> </RULE>
<RULE NAME="day_of_month"> <L PROPNAME="DAY_OF_MONTH" PROPID="DAY_OF_MONTH"> <P VAL="1">one</P> <P VAL="1">first</P> <P VAL="2">two</P> <P VAL="2">second</P> <P VAL="3">three</P> <P VAL="3">third</P> <P VAL="4">four</P> <P VAL="4">fourth</P> <P VAL="5">five</P> <P VAL="5">fifth</P> <P VAL="6">six</P> <P VAL="6">sixth</P> <P VAL="7">seven</P> <P VAL="7">seventh</P> <P VAL="8">eight</P> <P VAL="8">eighth</P> <P VAL="9">nine</P> <P VAL="9">ninth</P> <P VAL="10">ten</P> <P VAL="10">tenth</P> <P VAL="11">eleven</P> <P VAL="11">eleventh</P> <P VAL="12">twelve</P> <P VAL="12">twelfth</P> <P VAL="13">thirteen</P> <P VAL="13">thirteenth</P> <P VAL="14">fourteen</P> <P VAL="14">fourteenth</P> <P VAL="15">fifteen</P> <P VAL="15">fifteenth</P> <P VAL="16">sixteen</P> <P VAL="16">sixteenth</P> <P VAL="17">seventeen</P> <P VAL="17">seventeenth</P> <P VAL="18">eighteen</P> <P VAL="18">eighteenth</P> <P VAL="19">nineteen</P> <P VAL="19">nineteenth</P> <P VAL="20">twenty</P> <P VAL="20">twentieth</P> <P VAL="21">twenty one</P> <P VAL="21">twenty first</P> <P VAL="22">twenty two</P> <P VAL="22">twenty second</P> <P VAL="23">twenty three</P> <P VAL="23">twenty third</P> <P VAL="24">twenty four</P> <P VAL="24">twenty fourth</P> <P VAL="25">twenty five</P> <P VAL="25">twenty fifth</P> <P VAL="26">twenty six</P> <P VAL="26">twenty sixth</P> <P VAL="27">twenty seven</P> <P VAL="27">twenty seventh</P> <P VAL="28">twenty eight</P> <P VAL="28">twenty eighth</P> <P VAL="29">twenty nine</P> <P VAL="29">twenty ninth</P> <P VAL="30">thirty</P> <P VAL="30">thirtieth</P> <P VAL="31">thirty one</P> <P VAL="31">thirty first</P> </L> </RULE>
<RULE NAME="year"> <L> <P> <!-- stuff like "two thousand one" --> <RULEREF NAME="GRID_INTEGER"/> </P> <P> <!-- stuff like "nineteen seventy seven" --> <RULEREF NAME="GRID_DIGIT_NUMBER"/> </P> </L> </RULE>
<RULE NAME="month_year"> <P> <RULEREF NAME="month"/> </P> <P> <RULEREF NAME="GRID_YEAR" PROPNAME="YEAR" PROPID="YEAR"/> </P> </RULE>
<RULE NAME="year_month"> <P> <RULEREF NAME="GRID_YEAR" PROPNAME="YEAR" PROPID="YEAR"/> </P> <P> <RULEREF NAME="month_capital_necessary"/> </P> </RULE>
<RULE NAME="date_hundreds"> <P> <RULEREF NAME="twodigit" PROPNAME="TWODIGIT" PROPID="TWODIGIT"/> </P> <P> hundred </P> </RULE>
<!-- ************************************************************************
TIME QUANTITIES ************************************************************************ --> <RULE NAME="clock_hour"> <L PROPNAME="HOUR_CLOCK" PROPID="HOUR_CLOCK"> <P VAL="1">one</P> <P VAL="2">two</P> <P VAL="3">three</P> <P VAL="4">four</P> <P VAL="5">five</P> <P VAL="6">six</P> <P VAL="7">seven</P> <P VAL="8">eight</P> <P VAL="9">nine</P> <P VAL="10">ten</P> <P VAL="11">eleven</P> <P VAL="12">twelve</P> </L> </RULE>
<RULE NAME="clocktime_qualifier"> <L PROPNAME="CLOCKTIME_QUALIFIER" PROPID="CLOCKTIME_QUALIFIER"> <P VAL="QUARTER_TO">quarter to</P> <P VAL="QUARTER_TO">quarter til</P> <P VAL="QUARTER_PAST">quarter past</P> <P VAL="QUARTER_PAST">quarter after</P> <P VAL="HALF_PAST">half past</P> </L> </RULE>
<RULE NAME="minutes"> <P PROPNAME="ONES" PROPID="ONES"> <L> <P> <P> <RULEREF NAME="onesfrag_or_zero" PROPNAME="ONES" VAL="1"/> </P> </P> <P> <RULEREF NAME="clock_minutes"/> </P> </L> </P> </RULE>
<RULE NAME="clock_minutes"> <L> <P> <L> <P> oh </P> <P> zero </P> </L> <P> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </P> </P> <P> <RULEREF NAME="onesfrag_teens" PROPNAME="ONES" VAL="1"/> </P> <P> <P> <RULEREF NAME="tensfrag_minutes" PROPNAME="TENS" PROPID="TENS" VAL="10"/> </P> <O> <RULEREF NAME="digit_nonzero" PROPNAME="ONES" VAL="1"/> </O> </P> </L> </RULE>
<RULE NAME="tensfrag_minutes"> <L PROPNAME="TENS" PROPID="TENS"> <P VAL="2">twenty</P> <P VAL="3">thirty</P> <P VAL="4">forty</P> <P VAL="5">fifty</P> </L> </RULE>
<RULE NAME="am_pm"> <L PROPNAME="AMPM" PROPID="AMPM"> <P VAL="AM">AM</P> <P VAL="PM">PM</P> </L> <!--
<P PROPNAME="AM" PROPID="AM"> A.M. </P> <P PROPNAME="PM" PROPID="PM"> P.M. </P> </L> --> </RULE>
<!-- ************************************************************************
STATEZIP QUANTITIES ************************************************************************ -->
<RULE NAME="us_state"> <L PROPNAME="US_STATE" PROPID="US_STATE"> <P VAL="0" VALSTR="AL">Alabama</P> <P VAL="1" VALSTR="AK">Alaska</P> <P VAL="2" VALSTR="AS">American Samoa</P> <P VAL="3" VALSTR="AZ">Arizona</P> <P VAL="4" VALSTR="AR">Arkansas</P> <P VAL="5" VALSTR="CA">California</P> <P VAL="6" VALSTR="CO">Colorado</P> <P VAL="7" VALSTR="CT">Connecticut</P> <P VAL="8" VALSTR="DE">Delaware</P> <P VAL="9" VALSTR="DC">District of Columbia</P> <P VAL="9" VALSTR="DC">DC</P> <P VAL="10" VALSTR="FM">Federated States of Micronesia</P> <P VAL="11" VALSTR="FL">Florida</P> <P VAL="12" VALSTR="GA">Georgia</P> <P VAL="13" VALSTR="GU">Guam</P> <P VAL="14" VALSTR="HI">Hawaii</P> <P VAL="15" VALSTR="ID">Idaho</P> <P VAL="16" VALSTR="IL">Illinois</P> <P VAL="17" VALSTR="IN">Indiana</P> <P VAL="18" VALSTR="IA">Iowa</P> <P VAL="19" VALSTR="KS">Kansas</P> <P VAL="20" VALSTR="KY">Kentucky</P> <P VAL="21" VALSTR="LA">Louisiana</P> <P VAL="22" VALSTR="ME">Maine</P> <P VAL="23" VALSTR="MH">Marshall Islands</P> <P VAL="24" VALSTR="MD">Maryland</P> <P VAL="25" VALSTR="MA">Massachusetts</P> <P VAL="26" VALSTR="MI">Michigan</P> <P VAL="27" VALSTR="MN">Minnesota</P> <P VAL="28" VALSTR="MS">Mississippi</P> <P VAL="29" VALSTR="MO">Missouri</P> <P VAL="30" VALSTR="MT">Montana</P> <P VAL="31" VALSTR="NE">Nebraska</P> <P VAL="32" VALSTR="NV">Nevada</P> <P VAL="33" VALSTR="NH">New Hampshire</P> <P VAL="34" VALSTR="NJ">New Jersey</P> <P VAL="35" VALSTR="NM">New Mexico</P> <P VAL="36" VALSTR="NY">New York</P> <P VAL="37" VALSTR="NC">North Carolina</P> <P VAL="38" VALSTR="ND">North Dakota</P> <P VAL="39" VALSTR="MP">Northern Mariana Island</P> <P VAL="40" VALSTR="OH">Ohio</P> <P VAL="41" VALSTR="OK">Oklahoma</P> <P VAL="42" VALSTR="OR">Oregon</P> <P VAL="43" VALSTR="PA">Pennsylvania</P> <P VAL="44" VALSTR="PR">Puerto Rico</P> <P VAL="45" VALSTR="RI">Rhode Island</P> <P VAL="46" VALSTR="SC">South Carolina</P> <P VAL="47" VALSTR="SD">South Dakota</P> <P VAL="48" VALSTR="TX">Texas</P> <P VAL="49" VALSTR="UT">Utah</P> <P VAL="50" VALSTR="VT">Vermont</P> <P VAL="51" VALSTR="VA">Virginia</P> <P VAL="52" VALSTR="VI">Virgin Islands</P> <P VAL="53" VALSTR="WA">Washington</P> <P VAL="54" VALSTR="WV">West Virginia</P> <P VAL="55" VALSTR="WI">Wisconsin</P> <P VAL="56" VALSTR="WY">Wyoming</P> </L> </RULE>
<RULE NAME="can_province"> <L PROPNAME="CAN_PROVINCE" PROPID="CAN_PROVINCE"> <P VAL="0" VALSTR="AL">Alberta</P> <P VAL="1" VALSTR="BC">British Columbia</P> <P VAL="2" VALSTR="MB">Manitoba</P> <P VAL="3" VALSTR="NB">new Brunswick</P> <P VAL="3" VALSTR="NB">New Brunswick</P> <P VAL="4" VALSTR="NF">Newfoundland and Labrador</P> <P VAL="4" VALSTR="NF">Newfoundland</P> <P VAL="4" VALSTR="NF">Labrador</P> <P VAL="5" VALSTR="NT">Northwest Territories</P> <P VAL="5" VALSTR="NT">northwest territories</P> <P VAL="6" VALSTR="ON">Ontario</P> <P VAL="7" VALSTR="PE">Prince Edward Island</P> <P VAL="7" VALSTR="PE">Prince Edward island</P> <P VAL="8" VALSTR="PQ">Quebec</P> <P VAL="9" VALSTR="SK">Saskatchewan</P> </L> </RULE>
<RULE NAME="alpha"> <L PROPNAME="ALPHA" PROPID="ALPHA"> <P VAL="0" VALSTR="A">A.</P> <P VAL="1" VALSTR="B">B.</P> <P VAL="2" VALSTR="C">C.</P> <P VAL="3" VALSTR="D">D.</P> <P VAL="4" VALSTR="E">E.</P> <P VAL="5" VALSTR="F">F.</P> <P VAL="6" VALSTR="G">G.</P> <P VAL="7" VALSTR="H">H.</P> <P VAL="8" VALSTR="I">I.</P> <P VAL="9" VALSTR="J">J.</P> <P VAL="10" VALSTR="K">K.</P> <P VAL="11" VALSTR="L">L.</P> <P VAL="12" VALSTR="M">M.</P> <P VAL="13" VALSTR="N">N.</P> <P VAL="14" VALSTR="O">O.</P> <P VAL="15" VALSTR="P">P.</P> <P VAL="16" VALSTR="Q">Q.</P> <P VAL="17" VALSTR="R">R.</P> <P VAL="18" VALSTR="S">S.</P> <P VAL="19" VALSTR="T">T.</P> <P VAL="20" VALSTR="U">U.</P> <P VAL="21" VALSTR="V">V.</P> <P VAL="22" VALSTR="W">W.</P> <P VAL="23" VALSTR="X">X.</P> <P VAL="24" VALSTR="Y">Y.</P> <P VAL="25" VALSTR="Z">Z.</P> </L> </RULE>
<RULE NAME="comma"> <L> <P> comma </P> <P> , </P> </L> </RULE>
<!-- ************************************************************************
PHONE NUMBER QUANTITIES ************************************************************************ -->
<!--
three_digits_phone Area codes and exchanges never start with zero or one --> <RULE NAME="three_digits_phone"> <RULEREF NAME="digit_nonzero_or_one"/> <P MIN="2" MAX="2"> <RULEREF NAME="digit"/> </P> </RULE>
<RULE NAME="four_digits"> <P MIN="4" MAX="4"> <RULEREF NAME="digit"/> </P> </RULE>
<RULE NAME="dash_slash"> <L> <P> - </P> <P> dash </P> <P> slash </P> </L> </RULE>
<RULE NAME="one_plus"> <P> one </P> <O> <RULEREF NAME="dash_slash"/> </O> </RULE>
<RULE NAME="area_code"> <L> <P> <RULEREF NAME="three_digits_phone"/> </P> <L PROPNAME="AREA_CODE" PROPID="AREA_CODE"> <P VAL="800" VALSTR="800"> eight hundred </P> <P VAL="900" VALSTR="900"> nine hundred </P> </L> </L> </RULE>
<RULE NAME="extension"> <P MIN="1" MAX="8"> <RULEREF NAME="digit"/> </P> </RULE>
<!-- ************************************************************************
DEGREES QUANTITIES ************************************************************************ --> <RULE NAME="degrees"> <L> <P> degrees </P> <P> degree </P> </L> </RULE>
<RULE NAME="temp_units"> <L PROPNAME="TEMP_UNITS" PROPID="TEMP_UNITS"> <P VALSTR="F">Fahrenheit</P> <P VALSTR="C">Celsius</P> <P VALSTR="C">Centigrade</P> </L> </RULE>
<RULE NAME="direction"> <L PROPNAME="DIRECTION" PROPID="DIRECTION"> <P VALSTR="N">north</P> <P VALSTR="E">east</P> <P VALSTR="S">south</P> <P VALSTR="W">west</P> </L> </RULE>
<!-- ************************************************************************
MEASUREMENTS QUANTITIES ************************************************************************ -->
<!--
number_all A number_all is any type of number recognized by ITN and will never be called as a toplevel rule --> <RULE NAME="number_all"> <L> <P> <RULEREF NAME="GRID_INTEGER" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_FP_NUMBER" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> <P> <RULEREF NAME="GRID_FRACTION" PROPNAME="NUMBER" PROPID="NUMBER"/> </P> </L> </RULE>
<RULE NAME="units"> <L PROPNAME="UNITS" PROPID="UNITS"> <P VALSTR="ml">milliliter</P> <P VALSTR="ml">milliliters</P> <P VALSTR="kg">kilogram</P> <P VALSTR="kg">kilograms</P> <P VALSTR="kg">kilo</P> <P VALSTR="kg">kilo</P> <P VALSTR="kg">of a kilogram</P> <P VALSTR="km">kilometer</P> <P VALSTR="km">kilometers</P> <P VALSTR="km">of a kilometer</P> <P VALSTR="cm">centimeter</P> <P VALSTR="cm">centimeters</P> <P VALSTR="cm">of a centimeter</P> <P VALSTR="mm">millimeter</P> <P VALSTR="mm">millimeters</P> <P VALSTR="nm">nanometer</P> <P VALSTR="nm">nanometers</P> <P VALSTR="mu">micron</P> <P VALSTR="mu">microns</P> <P VALSTR="tsp.">teaspoon</P> <P VALSTR="tsp.">teaspoons</P> <P VALSTR="tsp.">of a teaspoon</P> <P VALSTR="tbsp.">tablespoon</P> <P VALSTR="tbsp.">tablespoons</P> <P VALSTR="tbsp.">of a tablespoon</P> <P VALSTR="fl. oz.">fluid ounce</P> <P VALSTR="fl. oz.">fluid ounces</P> <P VALSTR="mg">milligram</P> <P VALSTR="mg">milligrams</P> <P VALSTR="mph">mile per hour</P> <P VALSTR="mph">miles per hour</P> <P VALSTR="kph">kilometer per hour</P> <P VALSTR="kph">kilometers per hour</P> <P VALSTR="ms">millisecond</P> <P VALSTR="ms">milliseconds</P> <P VALSTR="K">K.</P> <P VALSTR="KB">kilobyte</P> <P VALSTR="KB">kilobytes</P> <P VALSTR="KB">K.B.</P> <P VALSTR="KB">K. byte</P> <P VALSTR="KB">K. bytes</P> <P VALSTR="MB">megabyte</P> <P VALSTR="MB">megabytes</P> <P VALSTR="MB">M.B.</P> <P VALSTR="MB">meg</P> <P VALSTR="MB">megs</P> <P VALSTR="GB">gigabyte</P> <P VALSTR="GB">gigabytes</P> <P VALSTR="GB">G.B.</P> <P VALSTR="GB">gig</P> <P VALSTR="GB">gigs</P> <P VALSTR="TB">terabyte</P> <P VALSTR="TB">terabytes</P> <P VALSTR="TB">T.B.</P>
<P VALSTR="Hz">hertz</P> <P VALSTR="MHz">megahertz</P>
<P VALSTR="W">watt</P> <P VALSTR="W">watts</P> <P VALSTR="kW">kilowatt</P> <P VALSTR="kW">kilowatts</P> <P VALSTR="kWh">kilowatt hour</P> <P VALSTR="kWh">kilowatt hours</P>
</L> </RULE> <RULE NAME="commonunits"> <L PROPNAME="UNITS" PROPID="UNITS"> <P VALSTR="yd.">yard</P> <P VALSTR="yds.">yards</P> <P VALSTR="yd.">of a yard</P> <P VALSTR="ft.">foot</P> <P VALSTR="ft.">feet</P> <P VALSTR="ft.">of a foot</P> <P VALSTR="in.">inch</P> <P VALSTR="in.">inches</P> <P VALSTR="in.">of an inch</P> <P VALSTR="m">meter</P> <P VALSTR="m">meters</P> <P VALSTR="m">of a meter</P> <P VALSTR="qt.">quart</P> <P VALSTR="qt.">quarts</P> <P VALSTR="qt.">of a quart</P> <P VALSTR="l">liter</P> <P VALSTR="l">liters</P> <P VALSTR="l">of a liter</P> <P VALSTR="lb.">pound</P> <P VALSTR="lbs.">pounds</P> <P VALSTR="lb.">of a pound</P> <P VALSTR="oz.">ounce</P> <P VALSTR="oz.">ounces</P> <P VALSTR="oz.">of an ounce</P> <P VALSTR="g">gram</P> <P VALSTR="g">grams</P> <P VALSTR="g">of a gram</P> </L> </RULE>
<!-- ************************************************************************
CURRENCY QUANTITIES ************************************************************************ -->
<RULE NAME="currency_type"> <L PROPNAME="CURRENCY_TYPE" PROPID="CURRENCY_TYPE"> <P VALSTR="$">dollar</P> <P VALSTR="$">dollars</P> <P VALSTR="�">pound</P> <P VALSTR="�">pounds</P> </L> </RULE>
<RULE NAME="currency_small_type"> <L PROPNAME="CURRENCY_SMALL_TYPE" PROPID="CURRENCY_SMALL_TYPE"> <P VALSTR="�">cent</P> <P VALSTR="�">cents</P> <P VALSTR="p">penny</P> <P VALSTR="p">pence</P> </L> </RULE>
</GRAMMAR>
|