Compiler principle operator first grammar semantic analysis c++ test code