:- multifile macro/2.

%% Translate number expressions into numbers, for
%% English and Dutch, in the range 1-99

%% Note:

%% 1. word is macro for coding sequences
%%    word(hello) is equivalent to [h,e,l,l,o]

%% 2. Always put numbers in single quotes


%% English, main macro

macro(eng2num,
      { one_nine,                 % 1 - 9
	eleven_nineteen,          % 11 - 19
	[ { word(ten):'1', twenty_ninety}, []:'0'],   % 10 - 90
	[ twenty_ninety, one_nine ]  % 21 - 99
      }
     ).

macro(one_nine,
      { word(one):'1',
	word(two):'2',
	word(three):'3',
	word(four):'4',
	word(five):'5',
	word(six):'6',
	word(seven):'7',
	word(eight):'8',
	word(nine):'9'
     }).

macro(eleven_nineteen,
      [[]:'1',
       { word(eleven):'1',
	 word(twelve):'2',
	 word(thirteen):'3',
	 word(fourteen):'4',
	 word(fifteen):'5',
	 word(sixteen):'6',
	 word(seventeen):'7',
	 word(eightteen):'8',
	 word(nineteen):'9'
       }
      ]).

macro(twenty_ninety,
      { word(twenty):'2',
	word(thirty):'3',
	word(forty):'4',
	word(fifty):'5',
	word(sixty):'6',
	word(seventy):'7',
	word(eighty):'8',
	word(ninety):'9'
      }
     ).


%% Dutch, Main macro

macro(nl2num,
      { een_negen,
	tien_negentien,
	twintig_negenennegentig
      }
     ).

macro(een_negen,
      { word(een):'1',
	word(twee):'2',
	word(drie):'3',
	word(vier):'4',
	word(vijf):'5',
	word(zes):'6',
	word(zeven):'7',
	word(acht):'8',
	word(negen):'9'
      }).

macro(tien_negentien,
      [[]:'1',
       { word(tien):'0',
	 word(elf):'1',
	 word(twaalf):'2',
	 word(dertien):'3',
	 word(veertien):'4',
	 word(vijftien):'5',
	 word(zestien):'6',
	 word(zeventien):'7',
	 word(achttien):'8',
	 word(negentien):'9'
       }
      ]).

%% Number words from 20 - 99 are formed by
%% a word from the een_negen transducer, followed by 'en', and
%% the word twintig ... negentig.
%% Note however that the number for 'twintig' (2) has to precede the
%% number produced by the een_negen transducer.
%% This is accounted for below, by first producing the number as output
%% without reading anything from the input, and at the end
%% reading the matching word without producing output.

macro(twintig_negenennegentig,
     {
      [ []:'2', infix_nul_negen, word(twintig):[] ],
      [ []:'3', infix_nul_negen, word(dertig):[] ],
      [ []:'4', infix_nul_negen, word(veertig):[] ],
      [ []:'5', infix_nul_negen, word(vijftig):[] ],
      [ []:'6', infix_nul_negen, word(zestig):[] ],
      [ []:'7', infix_nul_negen, word(zeventig):[] ],
      [ []:'8', infix_nul_negen, word(tachtig):[] ],
      [ []:'9', infix_nul_negen, word(negentig):[] ]
     }
    ).

macro(infix_nul_negen, { [een_negen, word(en):[]], []:'0' } ).

