abm机器指令模拟器(得到错误的输出)

问题描述 投票:0回答:1
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 10000
#define varr 6

struct Stack
{
    int top;
    unsigned capacity;
    int *array;
};

struct Stack *createStack(unsigned capacity)
{
    struct Stack *stack = (struct Stack *)malloc(sizeof(struct Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int *)malloc(stack->capacity * sizeof(int));
    return stack;
}

int isFull(struct Stack *stack)
{
    return stack->top == stack->capacity - 1;
}

int isEmpty(struct Stack *stack)
{
    return stack->top == -1;
}

void push(struct Stack *stack, int item)
{
    if (isFull(stack))
        return;
    stack->array[++stack->top] = item;
}

int pop(struct Stack *stack)
{
    if (isEmpty(stack))
        return INT_MIN;
    return stack->array[stack->top--];
}
int peek(struct Stack *stack)
{
    if (isEmpty(stack))
        return INT_MIN;
    return stack->array[stack->top];
}
int simulator(char newString[100][80], int p, int r, int var, int ctr, struct Stack *stack)
{

    if (newString[0][0] == 'p' && newString[0][1] == 'o' && newString[0][2] == 'p')
    {
        pop(stack);
    }

    else if (newString[0][0] == 's' && newString[0][1] == 'h' && newString[0][2] == 'o' && newString[0][3] == 'w')
    {
        for (int i = 1; i < ctr; i++)
        {
            printf("%s ", newString[i]);
        }
    }
    else if (newString[0][0] == 'p' && newString[0][1] == 'u' && newString[0][2] == 's' && newString[0][3] == 'h')
    {
        push(stack, atoi(newString[1]));
    }
    if (newString[0][0] == 'p' && newString[0][1] == 'r' && newString[0][2] == 'i' && newString[0][3] == 'n' && newString[0][4] == 't')
    {
        int val = peek(stack);
        printf("%d\n", val);
    }

    else if (newString[0][0] == 'd' && newString[0][1] == 'i' && newString[0][2] == 'v')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);

        int division = value2 % value1;
        push(stack, division);
    }
    else if (newString[0][0] == '-')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);

        int substraction = value1 - value2;
        push(stack, substraction);
    }
    else if (newString[0][0] == '+')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        int addition = value1 + value2;
        push(stack, addition);
    }
    else if (newString[0][0] == '/')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);

        int div = value2 / value1;
        push(stack, div);
    }
    else if (newString[0][0] == '<' && newString[0][1] == '>')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value1 == value2)
        {
            push(stack, 0);
        }
        else
        {
            push(stack, 1);
        }
    }
    else if (newString[0][0] == '<' && newString[0][1] == '=')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value2 <= value1)
        {
            push(stack, 1);
        }
        else
        {
            push(stack, 0);
        }
    }
    else if (newString[0][0] == '>' && newString[0][1] == '=')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value2 >= value1)
        {
            push(stack, 1);
        }
        else
        {
            push(stack, 0);
        }
    }
    else if (newString[0][0] == '<')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value2 < value1)
        {
            push(stack, 1);
        }
        else
        {
            push(stack, 0);
        }
    }
    else if (newString[0][0] == '>')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value2 > value1)
        {
            push(stack, 1);
        }
        else
        {
            push(stack, 0);
        }
    }

    else if (newString[0][0] == '=')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        if (value2 == value1)
        {
            push(stack, 1);
        }
        else
        {
            push(stack, 0);
        }
    }

    else if (newString[0][0] == '&')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        int value3 = value2 && value1;
        push(stack, value3);
    }
    else if (newString[0][0] == '|')
    {
        int value1 = pop(stack);
        int value2 = pop(stack);
        push(stack, value1);
        push(stack, value2);
        int value3 = value2 || value1;
        push(stack, value3);
    }
    else if (newString[0][0] == '!')
    {
        int value1 = pop(stack);
        push(stack, value1);
        push(stack, !value1);
    }
    else if (newString[0][0] == 'h' && newString[0][1] == 'a' && newString[0][2] == 'l' && newString[0][3] == 't')
    {
        return 0;
    }

    else if (newString[0][0] == 'c' && newString[0][1] == 'o' && newString[0][2] == 'p' && newString[0][3] == 'y')
    {
        int copy = peek(stack);
        push(stack, copy);
    }
}
int countspaces(char line[MAX_LINE_LENGTH])
{
    int spaces = 0;
    for (int i = 0; i <= (strlen(line)); i++)
    {
        if (line[0] == ' ')
        {
            spaces = 1;
        }
        if (line[0] == ' ' && line[1] == ' ')
        {
            spaces = 2;
        }
        if (line[0] == ' ' && line[1] == ' ' && line[2] == ' ')
        {
            spaces = 3;
        }
        if (line[0] == ' ' && line[1] == ' ' && line[2] == ' ' && line[3] == ' ')
        {
            spaces = 4;
        }
    }
    return spaces;
}
int main(int argc, char *argv[])
{
    FILE *filePointer;
    FILE *filePointer2;
    FILE *filePointer3;
    FILE *filePointer4;

    int globalcount = 0;
    int tempP = 0;
    int tempR = 0;
    int tempVar = 0;

    int j, ctr, count, i, d = 0, z = 5;
    int p = 0, r = 0, var = 0;
    int arraylabel[varr];
    int arraylabelend[varr];
    char arrayLname[varr][20];

    char newString[100][80];

    char line[MAX_LINE_LENGTH];

    struct Stack *stack = createStack(100);

    filePointer2 = fopen(argv[1], "r");

    if (NULL == filePointer2)
    {
        printf("file can't be opened \n");
        return 0;
    }
    if (argv[1][0] == 'd')
    {
        d = 1;
    }
    filePointer = fopen(argv[1], "r");

    if (NULL == filePointer)
    {
        printf("file can't be opened \n");
        return 0;
    }
    count = 0;
    int start, end, pCounter = 0, bstart, bend, bpCounter;
    while (fgets(line, MAX_LINE_LENGTH, filePointer2))
    {

        int spaces = countspaces(line);
        int order = 0;
        int t = 0;

        if (line[spaces] == 'l' && line[spaces + 1] == 'a' && line[spaces + 2] == 'b' && line[spaces + 3] == 'e' && line[spaces + 4] == 'l')
        {
            arraylabel[order] = count + 1;
            for (int s = 0; line[spaces + 6 + s] != '\0'; s++)
            {
                arrayLname[order][s] = line[spaces + 6 + s];
            }
            order++;

            if (line[spaces + 6] == 'f' && line[spaces + 7] == 'a' && line[spaces + 8] == 'c' && line[spaces + 9] == 't')
            {
                break;
            }
            if (line[spaces + 6] == 'b' && line[spaces + 7] == 'e')
            {
                break;
            }
        }

        if (line[spaces] == 'r' && line[spaces + 1] == 'e' && line[spaces + 2] == 't' && line[spaces + 3] == 'u' && line[spaces + 4] == 'r' && line[spaces + 5] == 'n')
        {
            arraylabelend[t] = count + 1;
            t++;
        }
        count++;
    }
    if (d == 1)
    {
        arraylabelend[0] = '0';
    }
    fclose(filePointer2);
    while (fgets(line, MAX_LINE_LENGTH, filePointer))
    {
        int begin = 0;
        int spaces = countspaces(line);
        j = 0;
        ctr = 0;
        for (i = spaces; i <= (strlen(line)); i++)
        {
            if ((line[i] == ' ' || line[i] == '\0'))
            {
                newString[ctr][j] = '\0';
                ctr++; // for next word
                j = 0; // for next word, init index to 0
            }
            else
            {
                newString[ctr][j] = line[i];
                j++;
            }
        }
        if (!(globalcount >= arraylabel[0] - 1 && globalcount <= arraylabelend[0]))
        {
            simulator(newString, p, r, var, ctr, stack);
            if (newString[0][0] == 'l' && newString[0][1] == 'v' && newString[0][2] == 'a' && newString[0][3] == 'l' && newString[0][4] == 'u' && newString[0][5] == 'e')
            {
                if (begin = 1)
                {
                    if (newString[1][0] == 'p')
                    {
                        int *address = &tempP;
                        int add = (int)address;
                        push(stack, add);
                    }
                    if (newString[1][0] == 'r')
                    {
                        int *address = &tempR;
                        int add = (int)address;
                        push(stack, add);
                    }

                    if (newString[1][0] == 'v' && newString[1][1] == 'a' && newString[1][2] == 'r')
                    {
                        int *address = &tempVar;
                        int add = (int)address;
                        push(stack, add);
                    }
                    else
                    {
                        int *address = &tempVar;
                        int add = (int)address;
                        push(stack, add);
                    }
                }
                else
                {
                    if (newString[1][0] == 'p')
                    {
                        int *address = &p;
                        int add = (int)address;
                        push(stack, add);
                    }

                    if (newString[1][0] == 'r')
                    {
                        int *address = &r;
                        int add = (int)address;
                        push(stack, add);
                    }

                    if (newString[1][0] == 'v' && newString[1][1] == 'a' && newString[1][2] == 'r')
                    {
                        int *address = &var;
                        int add = (int)address;
                    }
                    else
                    {
                        int *address = &var;
                        int add = (int)address;
                        //  push(stack, add);
                    }
                }
                pCounter++;
            }
            else if (newString[0][0] == 'r' && newString[0][1] == 'v' && newString[0][2] == 'a' && newString[0][3] == 'l' && newString[0][4] == 'u' && newString[0][5] == 'e')
            {
                int ret = 'x';
                if (begin = 1)
                {
                    if (newString[1][0] == 'p')
                    {
                        push(stack, 0);
                    }

                    if (newString[1][0] == 'r')
                    {
                        push(stack, tempR);
                    }

                    if (newString[1][0] == 'v' && newString[1][1] == 'a' && newString[1][2] == 'r')
                    {
                        push(stack, tempVar);
                    }
                    if (newString[1][0] == 'r' && newString[1][1] == 'e' && newString[1][2] == 't')
                    {
                        push(stack, ret);
                    }
                    if (newString[1][0] == 'a')
                    {
                        push(stack, z);
                    }
                    if (newString[1][0] == 'f')
                    {
                        push(stack, ret);
                    }
                    if (newString[1][0] == 'f' && d == 1)
                    {
                        push(stack, varr);
                    }
                    if (newString[1][0] == 'x')
                    {
                        push(stack, begin);
                    }
                    else
                    {
                        // push(stack, tempVar);
                    }
                }
                else
                {
                    if (newString[1][0] == 'p')
                    {
                        push(stack, p);
                    }
                    if (newString[1][0] == 'r')
                    {
                        push(stack, r);
                    }
                    if (newString[1][0] == 'v' && newString[1][1] == 'a' && newString[1][2] == 'r')
                    {
                        push(stack, var);
                    }
                    if (newString[1][0] == 'f' && d == 1)
                    {
                        push(stack, varr);
                    }
                    if (newString[1][0] == 'x')
                    {
                        push(stack, begin);
                    }

                    else
                    {
                        // push(stack, var);
                    }
                }
                pCounter++;
            }
            else if (newString[0][0] == ':' && newString[0][1] == '=')
            {
                int value3 = pop(stack);
                int adrs = pop(stack);
                int *ptr;
                ptr = adrs;
                *ptr = value3;
                push(stack, adrs);
                pCounter++;
            }
            else if ((newString[0][0] == 'b' && newString[0][1] == 'e' && newString[0][2] == 'g' && newString[0][3] == 'i' && newString[0][3] == 'n'))
            {
                begin = 1;
                pCounter++;
                continue;
            }
            else if ((newString[0][0] == 'e' && newString[0][1] == 'n' && newString[0][2] == 'd'))
            {
                begin = 0;
                pCounter++;
                continue;
            }

            if ((newString[0][0] == 'g' && newString[0][1] == 'o' && newString[0][2] == 't' && newString[0][3] == 'o') ||
                (newString[0][0] == 'g' && newString[0][1] == 'o' && newString[0][2] == 'f' && newString[0][3] == 'a' && newString[0][4] == 'l' && newString[0][5] == 's' && newString[0][6] == 'e') ||
                (newString[0][0] == 'g' && newString[0][1] == 'o' && newString[0][2] == 't' && newString[0][3] == 'r' && newString[0][4] == 'u' && newString[0][5] == 'e') ||
                (newString[0][0] == 'c' && newString[0][1] == 'a' && newString[0][2] == 'l' && newString[0][3] == 'l'))
            {
                int index = 0;
                for (int x = 0; x < 3; x++)
                {
                    if ((arrayLname[x][0] == newString[1][0]) && (arrayLname[x][1] == newString[1][1]))
                    {
                        index = x;
                    }
                }
                if (newString[0][0] == 'g' && newString[0][1] == 'o' && newString[0][2] == 'f' && newString[0][3] == 'a' && newString[0][4] == 'l' && newString[0][5] == 's' && newString[0][6] == 'e')

                {
                    int truefalse = pop(stack);
                    if (truefalse != 0)
                    {
                        continue;
                    }
                }
                if (newString[0][0] == 'g' && newString[0][1] == 'o' && newString[0][2] == 't' && newString[0][3] == 'r' && newString[0][4] == 'u' && newString[0][5] == 'e')

                {
                    int truefalse = pop(stack);
                    if (truefalse != 1)
                    {
                        continue;
                    }
                }

                char line1[MAX_LINE_LENGTH];
                filePointer3 = fopen(argv[1], "r");

                if (NULL == filePointer3)
                {
                    printf("file can't be opened \n");
                    return 0;
                }
                int whilecount = 0;
                while (fgets(line1, MAX_LINE_LENGTH, filePointer3))
                {

                    int spaces1 = countspaces(line1);

                    int j, ctr1, i;
                    char newString1[100][80];

                    j = 0;
                    ctr1 = 0;
                    for (i = spaces1; i <= (strlen(line1)); i++)
                    {
                        if (line1[i] == ' ' || line1[i] == '\0')
                        {
                            newString1[ctr1][j] = '\0';
                            ctr1++; // for next word
                            j = 0;  // for next word, init index to 0
                        }
                        else
                        {
                            newString1[ctr1][j] = line1[i];

                            j++;
                        }
                    }
                    if (whilecount >= arraylabel[0] && whilecount <= arraylabelend[0])
                    {
                        int pvar = 2;
                        int rval = 0;
                        simulator(newString1, p, r, var, ctr1, stack);
                        if (newString1[0][0] == 'l' && newString1[0][1] == 'v' && newString1[0][2] == 'a' && newString1[0][3] == 'l' && newString1[0][4] == 'u' && newString1[0][5] == 'e')
                        {
                            if (begin = 1)
                            {
                                if (newString[1][0] == 'p')
                                {
                                    int *address = &tempP;
                                    int add = (int)address;
                                }

                                if (newString[1][0] == 'r')
                                {
                                    int *address = &tempR;
                                    int add = (int)address;
                                }

                                if (newString[1][0] == 'v' && newString[1][1] == 'a' && newString[1][2] == 'r')
                                {
                                    int *address = &tempVar;
                                    int add = (int)address;
                                }
                                else
                                {
                                    int *address = &tempVar;
                                    int add = (int)address;
                                }
                            }
                            else
                            {
                                if (newString1[1][0] == 'p')
                                {
                                    int *address = &p;
                                    int add = (int)address;
                                }

                                if (newString1[1][0] == 'r')
                                {
                                    int *address = &r;
                                    int add = (int)address;
                                }

                                if (newString1[1][0] == 'v' && newString1[1][1] == 'a' && newString1[1][2] == 'r')
                                {
                                    int *address = &var;
                                    int add = (int)address;
                                }
                                else
                                {
                                    int *address = &var;
                                    int add = (int)address;
                                }
                            }
                        }
                        else if (newString1[0][0] == 'r' && newString1[0][1] == 'v' && newString1[0][2] == 'a' && newString1[0][3] == 'l' && newString1[0][4] == 'u' && newString1[0][5] == 'e')
                        {

                            if (begin = 1)
                            {

                                if (newString1[1][0] == 'p')
                                {
                                    push(stack, pvar);
                                }

                                if (newString1[1][0] == 'r')
                                {
                                    push(stack, rval);
                                }

                                if (newString1[1][0] == 'v' && newString1[1][1] == 'a' && newString1[1][2] == 'r')
                                {
                                    push(stack, tempVar);
                                }
                                if (newString1[1][0] == 'f')
                                {
                                    push(stack, z);
                                }
                                if (newString1[1][0] == 'x')
                                {
                                    push(stack, rval);
                                }
                                else
                                {
                                    // push(stack, 1);
                                }
                            }
                            else
                            {
                                if (newString1[1][0] == 'p')
                                {
                                    push(stack, p);
                                }
                                if (newString1[1][0] == 'r')
                                {
                                    push(stack, r);
                                }
                                if (newString1[1][0] == 'v' && newString1[1][1] == 'a' && newString1[1][2] == 'r')
                                {
                                    push(stack, var);
                                }

                                else
                                {
                                    // push(stack, tempVar);
                                }
                            }
                        }
                        else if (newString1[0][0] == ':' && newString1[0][1] == '=')
                        {
                            int value3 = pop(stack);
                            int adrs = pop(stack);
                            int *ptr;
                            ptr = adrs;
                            *ptr = value3;
                            push(stack, adrs);
                        }
                    }
                    whilecount++;
                }
            }
            else if (newString[0][0] == 'l' && newString[0][1] == 'a' && newString[0][2] == 'b' && newString[0][3] == 'e' && newString[0][4] == 'l')
            {
            }
            globalcount++;
        }
    }
    fclose(filePointer);

    return 0;
}

详情 您将为 abm 抽象机开发一个模拟器。您的模拟器必须支持所有 abm-instruction-set.doc 文档中包含说明。你可以参考abm程序 文件 demo.abm、factProc.abm、foo.abm、operatorsTest.abm 和 recursiveFactorial.abm 提供帮助 您将了解 abm 机器的语法和语义。

如何运行程序? gcc hello.c -o abmsimulator • ./abmsimulator 文件名.abm

当我给它一个operatorsTest.abm文件时,它会显示输出,但是 - 功能无法正常工作,就像我得到这个答案一样:

5 - 4 = 1
 -1 //the ans must be 1
--------------------------------
 4 - 5 = -1
 1 //the ans must be -1 

operatorTest.abm 文件

show  
show  This code illustrates basic arithmetic
show  and logical operations.
show
rvalue var
show Variables are initialized to "zero"
show Value of var is:
print 
pop    
show --------------------------------
push 5
push 4
show 5 - 4 = 1
-
print
pop
show --------------------------------
push 4
push 5
show 4 - 5 = -1
-
print
pop
show --------------------------------
push 5
push 4
show 5 div 4 = 1
div 
print
pop    
show --------------------------------
push 4
push 5
show 4 div 5 = 4
div
print
pop    
show --------------------------------
push 4
push 3
show 4 / 3 = 1
/
print 
pop    
show --------------------------------
push 3
push 4
show 3 / 4 = 0
/
print
pop    
show --------------------------------
push 0
push 1
show 0 & 1 = 0
&
print
pop   
show --------------------------------
push 0
push 1
show 0 | 1 = 1
|
print 
pop    
show --------------------------------
push 0
show !0 = 1
!
print
pop    
show --------------------------------
push 4
push 3
show 4 <> 3 = 1 
<>
print
pop    
show --------------------------------
push 3 
push 4
show 3 <= 4 = 1
<=
print 
pop
show --------------------------------
push 3
push 4
show 3 >= 4 = 0
>=
print
pop
show --------------------------------
push 3
push 4
show 3 < 4 = 1
<
print
pop
show --------------------------------
push 3
push 4
show 3 > 4 = 0 
>
print
pop
show -------------------------------
halt

文件应与代码文件位于同一目录中。

这是我得到的输出

如何解决这个问题?

c stack simulator warren-abstract-machine
1个回答
0
投票

嘿,你解决了吗?我在这项作业中也需要帮助

© www.soinside.com 2019 - 2024. All rights reserved.