Beispiel #1
0
void constructOpStringLine1(string *dest, tVariable *operand) {
    switch(operand->type) {
    case O_BOOL:
        strFromChar(dest, "BOOLEAN");
        break;
    case O_INT:
        strFromChar(dest, "INT");
        break;
    case O_REAL:
        strFromChar(dest, "DOUBLE");
        break;
    case O_STRING:
        strFromChar(dest, "STRING");
        break;
    case NONTRM:
        strFromChar(dest, "NONTRM");
        break;
    case O_NOTDATA:
        strFromChar(dest, "O_NOTDATA");
        break;
    case FUNCTION:
        strFromChar(dest, "FUNCTION");
        break;
    case TAPE_POINTER:
        strFromChar(dest, "TAPE_POINTER");
        break;
    case PARAM_POINTER:
        strFromChar(dest, "PARAM_POINTER");
        break;
    }
}
Beispiel #2
0
void constructOpStringLine2(string *dest, tVariable *operand) {
    char str[100];      // prasarna, ale debug

    switch(operand->type) {
    case O_BOOL:
        if(operand->value.bval == true) {
            strFromChar(dest, "true");
        } else {
            strFromChar(dest, "false");
        }
        break;
    case O_INT:
        sprintf(str, "%d", &operand->value.ival);
        strFromChar(dest, str);
        break;
    case O_REAL:
        sprintf(str, "%d", &operand->value.rval);
        strFromChar(dest, str);
        break;
    case O_STRING:
        strCopystring(dest, &(operand->value.sval));
        break;
    case NONTRM:
        strFromChar(dest, "nonterm");
        break;
    case O_NOTDATA:
        strFromChar(dest, "O_NOTDATA");
        break;
    case FUNCTION:
        strCopystring(dest, &(operand->name));
        break;
    case TAPE_POINTER:
        sprintf(str, "%llx", (long long)operand->value.tape_pointer);
        strFromChar(dest, str);
        break;
    case PARAM_POINTER:
        sprintf(str, "%llx", (long long)operand->value.param_pointer);
        strFromChar(dest, str);
        break;

    }
}
    bool derpGetTokens(
        const std::string &str,
        std::vector<DerpToken*> &outTokens,
        DerpErrorState &errorState,
        const std::string &fileName) {

        unsigned int i = 0;
        unsigned int lineNumber = 1;

        while(i < str.size()) {

            // Skip over whitespace.
            while(i < str.size() && isWhitespace(str[i])) {

                if(str[i] == '\n') lineNumber++;

                i++;
            }

            if(i >= str.size()) break;

            // Figure out token type with a big ugly if/else thinger.

            if(str[i] == '/' && (i + 1) < str.size() && str[i+1] == '/') {

                // C++ style comment. Just throw it away.
                i += 2;
                while(i < str.size()) {
                    if(str[i] == '\n') break;
                    i++;
                }

            } else if(str[i] == '#') {

                // Shell-script style comment. Just throw it away too.
                i++;
                while(i < str.size()) {
                    if(str[i] == '\n') break;
                    i++;
                }

            } else if(str[i] == '\"') {

                // Found a literal quoted string.
                DerpToken *stringToken = parseString(
                    str, i, fileName, lineNumber, errorState);
                if(!stringToken) {
                    return false;
                }

                outTokens.push_back(stringToken);

            } else if(isDigit(str[i])) {

                // Found a number
                outTokens.push_back(parseNumber(str, i, fileName, lineNumber));

            } else if(isValidSymbolChar(str[i], true)) {

                // Found either a symbol or a keyword.
                DerpToken *symbolToken = parseSymbolOrKeyword(
                    str, i, fileName, lineNumber, errorState);
                if(!symbolToken) {
                    return false;
                }

                outTokens.push_back(symbolToken);

            } else {

                // Found some special character.

                // TODO: Replace this with some table-based lookup.

                bool foundTwoCharacterOperator = false;

                // First check all the two-character operators.

                if(str.size() > (i + 1)) {

                    char twoCharOp[3] = {
                        str[i], str[i+1], 0
                    };

                    if(string(":=") == twoCharOp ||
                       string("&&") == twoCharOp ||
                       string("||") == twoCharOp ||
                       string("!=") == twoCharOp ||
                       string("==") == twoCharOp ||
                       string("++") == twoCharOp ||
                       string("--") == twoCharOp ||
                       string(">=") == twoCharOp ||
                       string("<=") == twoCharOp) {

                        foundTwoCharacterOperator = true;
                        outTokens.push_back(new DerpToken(twoCharOp, DERPTOKEN_MATHOP, fileName, lineNumber));
                        i += 2;
                    }

                }

                // If it wasn't a two-character operator, try the
                // single-character operators.

                if(!foundTwoCharacterOperator) {

                    switch(str[i]) {

                        case '{':

                            // Found an open curly.
                            outTokens.push_back(new DerpToken("{", DERPTOKEN_OPENCURLY, fileName, lineNumber));
                            i++;
                            break;

                        case '}':

                            // Found a closing curly.
                            outTokens.push_back(new DerpToken("}", DERPTOKEN_CLOSECURLY, fileName, lineNumber));
                            i++;
                            break;

                        case '[':

                            // Found an open curly.
                            outTokens.push_back(new DerpToken("[", DERPTOKEN_OPENBRACKET, fileName, lineNumber));
                            i++;
                            break;

                        case ']':

                            // Found a closing curly.
                            outTokens.push_back(new DerpToken("]", DERPTOKEN_CLOSEBRACKET, fileName, lineNumber));
                            i++;
                            break;

                        case '(':

                            // Found an open parenthesis.
                            outTokens.push_back(new DerpToken("(", DERPTOKEN_OPENPAREN, fileName, lineNumber));
                            i++;
                            break;

                        case ')':

                            // Found a closing parenthesis.
                            outTokens.push_back(new DerpToken("(", DERPTOKEN_CLOSEPAREN, fileName, lineNumber));
                            i++;
                            break;

                        case ';':

                            // End statement.
                            outTokens.push_back(new DerpToken(";", DERPTOKEN_ENDSTATEMENT, fileName, lineNumber));
                            i++;
                            break;

                        case ',':
                            outTokens.push_back(new DerpToken(",", DERPTOKEN_COMMA, fileName, lineNumber));
                            i++;
                            break;

                        case '+':
                        case '-':
                        case '*':
                        case '/':
                        case '!':
                        case '=':
                        case '<':
                        case '>':
                        case '.':

                            // Found math operator.
                            outTokens.push_back(new DerpToken(strFromChar(str[i]), DERPTOKEN_MATHOP, fileName, lineNumber));
                            i++;
                            break;

                        default:

                            // I have no idea what to do with this. Toss an error and return.

                            errorState.setFileAndLineDirect(
                                fileName,
                                lineNumber);

                            errorState.addError(
                                derpSprintf("Bad token: \"%c\"", str[i]));

                            return false;
                    }

                }

            }

            if(outTokens.size() > DERP_MAX_TOKENS) {

                errorState.setFileAndLineDirect(
                    fileName,
                    lineNumber);

                errorState.addError(
                    "Exceeded maximum number of tokens.");

                return false;
            }
        }

        return true;
    }
Beispiel #4
0
void constructInstStringLine2(string *dest, tTapeItem *instruction) {
    char str[100];      // prasarna, ale debug
    sprintf(str, "%llx", (long long)instruction);
    strFromChar(dest, str);
}
Beispiel #5
0
void constructInstStringLine1(string *dest, tInstruction instruction) {
    switch(instruction) {
    case ADD:
        strFromChar(dest, "ADD");
        break;
    case MUL:
        strFromChar(dest, "MUL");
        break;
    case SUB:
        strFromChar(dest, "SUB");
        break;
    case DIV:
        strFromChar(dest, "DIV");
        break;
    case EQ:
        strFromChar(dest, "EQ");
        break;
    case NEQ:
        strFromChar(dest, "NEQ");
        break;
    case EQL:
        strFromChar(dest, "EQL");
        break;
    case EQM:
        strFromChar(dest, "EQM");
        break;
    case MORE:
        strFromChar(dest, "MORE");
        break;
    case LESS:
        strFromChar(dest, "LESS");
        break;
    case NOP:
        strFromChar(dest, "NOP");
        break;
    case NOPJ:
        strFromChar(dest, "NOPJ");
		    case JUMP:
        strFromChar(dest, "JUMP");
        break;
    case JUMPN:
        strFromChar(dest, "JUMPN");
        break;
        break;
    case ASSIGN:
        strFromChar(dest, "ASSIGN");
        break;
	  case CALL:
        strFromChar(dest, "CALL");
        break;
    case FUNC:
        strFromChar(dest, "FUNC");
        break;
    }
}