Appendix A.

Keyword Tokenizer

This is the code which tells Prolog how to compile a list of reserved words. Once the term_expansion/2 clause at the end of this file is defined, Prolog will compile 'Reserved Words'(Language,List) as a list of facts (one for each word in List), which will turn different forms of the words into consistent, lower-case tokens.

For the VHDL parser, this code, reserved.pl , must be compiled before vhdl_tokens.pl .


term_expansion('Reserved Words'(Lang,W),TMAP) :-
        concat_atom([Lang,'_token_map'],TMAP),
        tell('tokens.pl'),
          produce_map(W,Lang),
          produce_keyword(W,Lang),
          produce_tokens(W,Lang),
        told,
        consult(tokens),
        shell('/bin/rm tokens.pl').

produce_map([],_).
produce_map([token(_)|Ts],Lang) :-
    !,
    produce_map(Ts,Lang).
produce_map([T|Ts],Lang) :-
    name(T,[L1|Ls]),
    ( Ls = [] ->
             format('~a_reserved(0''~c,[],''~s''):-!.~n',[Lang,L1,[L1|Ls]])
          ;
             format('~a_reserved(0''~c,"~s",''~s''):-!.~n',[Lang,L1,Ls,[L1|Ls]])
    ),
    produce_map(Ts,Lang).

produce_keyword([],_).
produce_keyword([token(_)|Ts],Lang) :-
    !,
    produce_keyword(Ts,Lang).
produce_keyword([T|Ts],Lang) :-
    format('~a_keyword(~q).~n',[Lang,T]),
    produce_keyword(Ts,Lang).

produce_tokens([],_).
produce_tokens([token(T)|Ts],Lang) :-
    !,
    format('~a_token(~a(_)).~n',[Lang,T]),
    produce_tokens(Ts,Lang).
produce_tokens([T|Ts],Lang) :-
    format('~a_token(~q).~n',[Lang,T]),
    produce_tokens(Ts,Lang).