Task

Implement a    HQ9+    interpreter or compiler.




% hq9+ Erlang implementation (JWL)
% http://www.erlang.org/
-module(hq9p).
-export([main/1]).
 
%% bottle helper routine
bottle(0) ->
  io:format("No more bottles of beer ");
 
bottle(1) ->
  io:format("1 bottle of beer ");
 
bottle(N) when N > 0 ->
  io:format("~w bottles of beer ", [N]).
 
%% Implementation of instructions	
beer(0) ->
  bottle(0), io:format("on the wall~n"),
  bottle(0), io:format("on the wall~nGo to the store and buy some more~n"),
  io:format("99 bottles of beer on the wall.~n");
 
beer(N) ->
  bottle(N), io:format("on the wall~n"),
  bottle(N), io:format("~nTake one down and pass it around~n"),
  bottle(N-1), io:format("on the wall~n~n"),
  beer(N-1).
 
hello() ->
  io:format("Hello world!~n", []).
 
prog(Prog) ->
  io:format("~s~n", [Prog]).
 
inc(Acc) ->
  Acc+1.
 
%% Interpreter	
execute(Instruction, Prog, Acc) ->
  case Instruction of
    $H -> hello(), Acc;
    $Q -> prog(Prog), Acc;
    $9 -> beer(99), Acc;
    $+ -> inc(Acc);
       _ -> io:format("Invalid instruction: ~c~n", [Instruction]), Acc
  end.
 
main([], _Prog, Acc) ->
  Acc;
 
main([Instruction | Rest], Prog, Acc) ->
  NewAcc = execute(Instruction, Prog, Acc),
  main(Rest, Prog, NewAcc).
 
main(Prog) ->
  Compiled = string:to_upper(Prog),
  main(Compiled, Prog, 0).
 
 