unit umbrTonica;

interface
uses sysUtils;

function descobreTonica (palavra: string): integer;

implementation

{--------------------------------------------------------}

function descobreTonica (palavra: string): integer;
var
    p: integer;
    c: char;
    posAcento: integer;
    estado : integer;                   { Indica estado corrente do diagrama }

const
    vogais: set of char =
        ['A','E','I','O','U','Y','W','Ü'];
    acentos: set of char =
        ['Á','Â','Ã','À','É','Ê','Í','Ó','Ô','Õ','Ú'];
begin
    descobreTonica := 0;
    posAcento := 0;
    for p := length (palavra) downto 1 do
        begin
            c := palavra[p];
            if c in acentos then
                 begin
                     descobreTonica := p;
                     exit;
                 end;
            if (posAcento = 0) and (c in vogais) then
                posAcento := p;
        end;

    if posAcento = 0 then exit;   // palavra não tem vogais

    descobreTonica := posAcento;
    estado := 0;
    p := length (palavra);

    while p > 0 do
        begin
            c := palavra[p];

            case estado of
                0: case c of
                       'A', 'E', 'O':
                            begin
                                descobreTonica := p;
                                estado := 1;
                            end;
                       'U':
                            begin
                                descobreTonica := p;
                                estado := 10;
                            end;
                       'I':
                            begin
                                descobreTonica := p;
                                estado := 20;
                            end;
                       'S': estado := 0;
                       'M': estado := 40;
                   else
                       estado := 30;
                   end;

            {--- palavras com última vogal 'a', 'e', 'o' ---}

                1: if c = 'U' then
                       estado := 4
                   else
                   if c in vogais then
                       begin
                           descobreTonica := p;
                           p := 0;
                       end
                   else
                       estado := 2;

                2: case c of
                       'I', 'U':
                           begin
                               descobreTonica := p;
                               estado := 3;
                           end;
                       'A', 'E', 'O':
                           begin
                               descobreTonica := p;
                               p := 0;
                           end;
                    end;

                3: begin
                        if c in ['A','E','O'] then
                            begin
                                descobreTonica := p;
                                p := 0;
                            end
                        else
                            if c = 'U' then
                                estado := 5
                        else
                             p := 0;
                    end;

                4: begin
                       if c in ['G','Q'] then
                           begin
                               descobreTonica := p + 2;
                               estado := 2;
                           end
                       else
                           begin
                               descobreTonica := p + 1;
                               p := 0;
                           end;
                   end;

                5: begin
                       if c in ['G','Q'] then
                           descobreTonica := p + 2
                       else
                           descobreTonica := p + 1;
                       p := 0;
                   end;

            {--- palavras com última vogal 'u' ---}

                10: begin
                        if c in ['A','E','I','O'] then
                            descobreTonica := p;
                        p := 0;
                    end;

            {--- palavras com última vogal 'i' ---}

                20: begin
                        if c in ['A','E','O'] then
                            descobreTonica := p
                        else
                            if c = 'U' then
                                estado := 21
                            else
                                p := 0;
                    end;

                21: begin
                        if c in ['G','Q'] then
                            descobreTonica := p + 2
                        else
                            descobreTonica := p + 1;
                        p := 0;
                    end;

            {--- palavras terminadas por consoante, exceto 's', 'm' ---}

                30: if c in vogais then
                       begin
                           descobreTonica := p;
                           p := 0;
                      end;

            {--- palavras terminadas por 'm' ---}

                40: if c in ['I', 'O', 'U'] then
                        begin
                           descobreTonica := p;
                           p := 0;
                        end
                    else
                        if c in ['A', 'E'] then
                            begin
                                descobreTonica := p;
                                estado := 1;
                            end
                        else
                            estado := 0;
            end;

            p := p - 1;
        end;
end;

end.
