TryAlgo

Translate between Java and C++ style identifiers

Java style identifiers consist of lower and upper case letters, starting with lower cases. C++ style identifiers consist of lower case letters and the underscore sign. Given a word you should detect its style and translate it into the other style, or produce the string “Error!” if it not in one of the styles.

A linear time algorithm

It is based on a finite state automaton, that we depict here. The algorithm processes the letters of the string in order, and according to the current state possibly produces some string and moves to another state.

import static java.lang.Character.*;


class Main {

    static final int JAVA=0, CPP=1, UNDER=2, NONE=3, FIRST=4;

    static String translate(String s) {
    StringBuffer r = new StringBuffer();
    int state=FIRST;
    for (char c: s.toCharArray()) {
        if (c=='_')
        switch (state) {
        case JAVA:
        case FIRST:
            return "Error!";
        case NONE:
        case CPP:
            state = UNDER;
            break;
        case UNDER:
            return "Error!";
            // nothing to do
        }
        else if (isUpperCase(c))
        switch (state) {
        case FIRST:
            return "Error!";
        case NONE:
            state = JAVA;
            // pas de break expres
        case JAVA:
            r.append("_"+toLowerCase(c));
            break;
        case CPP:
        case UNDER:
            return "Error!";
        }
        else // c is a lower case letter
        switch (state) {
        case FIRST:
            state = NONE;
            // pas de break expres
        case UNDER:
            r.append(toUpperCase(c));
            state = CPP;
            break;
        default:
            r.append(c);
        }
    }
    if (state==UNDER)
        return "Error!";
    else
        return ""+r;
    }

    public static void main(String args[]) {
    Scanner in = new Scanner(System.in);
    System.out.println(translate(in.next()));
    }
}