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).