c语言中的文本分析器 [英] Text Analyzer in c Language

查看:87
本文介绍了c语言中的文本分析器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

项目:用c语言编写程序从文件中接收代码并进行分析,以便将正确的代码放入文件中,将错误的代码放入另一个文件中

结构可用&安培;语法

1 - 声明变量 var i;

2- i = i + 1 ;

3- for(i = 0; i< 4; i ++){// your code};

4 - if(i< 3){// your code};

5- while(i< 3){// your code};

6- / *多行评论* /

7-可变一个字符

_________________________________

如果文件中的代码是:

Project: Write program in c Language that receives codes from a file and analyzed, so that puts the correct codes in a file and wrong codes in another file
Structures available & Grammar
1-Declaring a Variable var i;
2- i =i+1;
3- for(i=0;i<4;i++){//your code };
4- if(i<3){ //your code };
5- while(i<3){//your code };
6- /*multi line comment */
7- Variable one Character
_________________________________
if code in file is :

var i,x=2;
for{i=0;);i<3;i++}{
      iff(i==2){
            x=x+2;
          }  



文件中的错误代码是:


wrong codes in file is:

LINE2 ;)
LINE3 f
LINE6 }



正确的代码:


correct codes :

for{i=0;i<3;i++}{
      if(i==2){
            x=x+2;
          };
       };





编写此程序的步骤是什么



What are the steps to write this program

推荐答案

怎么写这个程序?



我们不做你的作业:这是有原因的。它就是为了让你思考你被告知的事情,并试着理解它。它也在那里,以便您的导师可以识别您身体虚弱的区域,并将更多的注意力集中在补救措施上。

亲自尝试,您可能会发现它并不像您想象的那么难! />


首先将其分解为较小的任务:读取文件,分析文件,输出正确和错误的数据。然后将它们分解,直到你得到的任务 可管理。 分析任务将是一个复杂的任务,所以假它开始,并确保其他工作正常。

然后开始分析。看看什么是合法的,并开始检查你收到的是否匹配。想想你将如何手动完成,甚至用铅笔和纸做!一旦你解决了这个问题,计算机化的版本就会自行编写。



如果你遇到一个具体的问题,那么请问一下这个问题我们会做的最好的帮助。但我们不打算为你做这一切!
"how write this program?"

We do not do your homework: it is set for a reason. It is there so that you think about what you have been told, and try to understand it. It is also there so that your tutor can identify areas where you are weak, and focus more attention on remedial action.
Try it yourself, you may find it is not as difficult as you think!

Start by breaking it down into smaller tasks: read the file, analyse the file, output the right and wrong data. Then break those down until the tasks you get are manageable. The "analyse" task is going to be the complex one, so "dummy it" to start with, and make sure the others are working fine.
Then start on the analysis. Look at what is legal, and start checking if what you have received matches. Think about how you would do it manually, or even do it with a pencil and paper! Once you work that out, the "computerised" version will pretty much write itself.

If you meet a specific problem, then please ask about that and we will do our best to help. But we aren't going to do it all for you!


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
FILE *file, *fw, *fc;
int j = 0, i, n = 0;
char ch, matrix[500], temp[500];
int test_if(int i);
int test_while(int i);
int test_for(int i);
int test_var(int i);
int test_variable(int i);

void copy() {
    i = 0;
    memset(matrix, '\0', 500);
    file = fopen("code.txt", "r+");
    while ((ch = getc(file)) != EOF) {
        matrix[i] = ch;
        i++;
    }
    fclose(file);

}

void commend() {
    for (i = 0; i < strlen(matrix); i++) {
        if (matrix[i] == '/' && matrix[i + 1] == '*') {
            do {
                i++;
            } while (matrix[i] != '/' && matrix[i + 1] != '*' && i < (strlen(matrix) - 1));
            i += 3;
        }
        strncat(temp, matrix + i, 1);
    }
    memset(matrix, '\0', 500);
    strcpy(matrix, temp);
}

int test(int q) {
    for (i = q; i < strlen(matrix); i++) {
        while (matrix[i] == ' ' || matrix[i] == '\n') {
            i++;
        }
        if ((matrix[i] != 'v' && matrix[i + 1] != 'a' && matrix[i + 2] != 'r')&&(matrix[i] != 'i' && matrix[i + 1] != 'f')&&(matrix[i] != 'f' && matrix[i + 1] != 'o' && matrix[i + 2] != 'r') &&(matrix[i] != 'w' && matrix[i + 1] != 'h' && matrix[i + 2] != 'i' && matrix[i + 3] != 'l' && matrix[i + 4] != 'e') && isalpha(matrix[i])) {
            i = test_variable(i);
            return i;
        } else {
            switch (matrix[i]) {
                case 'i':
                    i = test_if(i);
                    return i;
                    break;
                case 'w':
                    i = test_while(i);
                    return i;
                    break;
                case 'v':
                    i = test_var(i);
                    return i;
                    break;
                default:
                    return i;
                    break;
            }
        }
    }
}

int main(int argc, char **argv) {
    fc = fopen("fc.txt", "w+");
    fw = fopen("fw.txt", "w+");
    copy();
    commend();
    test(0);
    fclose(fc);
    fclose(fw);
}

int test_if(int i) {
    int j;
    char var = '\0', sim = '\0', x, y, l_par = '\0', r_par = '\0', op, num, ll_par = '\0', rr_par = '\0', z;
    if (matrix[i] == 'i' && matrix[i + 1] == 'f') {
        for (j = i + 2; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            l_par = matrix[j];
            break;
        }
        if (l_par != '(')
            j = i + 1;
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ' || matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=' || matrix[i] == ')' || matrix[i] == '{' || isdigit(matrix[i])) {
                if (matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=' || matrix[i] == ')' || matrix[i] == '{' || isdigit(matrix[i]))
                    break;
                continue;
            }
            var = matrix[i];
            break;
        }
        if (matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=') {
            i = i - 1;
        }
        if (isdigit(matrix[i])) {
            goto after_op;
            j = j - 1;
        }
        if (matrix[i] == ')') {
            goto after_op_and_number;
            i = j - 1;
        }
        if (matrix[i] == '{') {
            goto after_op_number_rpar;
            j = j - 1;
        }
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            op = matrix[j];
            break;
        }
after_op:
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ')
                continue;
            num = matrix[i];
            break;
        }
after_op_and_number:
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            r_par = matrix[j];
            break;
        }
after_op_number_rpar:
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ')
                continue;
            ll_par = matrix[i];
            break;
        }
        if (isalpha(var) && (op == '>' || op == '<' || op == '=') && isdigit(num)) // var op num
            fprintf(fc, "if(%c%c%c){\n", var, op, num);
        else if (isalpha(var) && (op == '>' || op == '<' || op == '=')) { // var op
            printf("enter number for if \n");
            scanf("%c", &x);
            fprintf(fc, "if(%c%c%c){\n", var, op, x);
            fprintf(fw, "error in if\n");
        } else if (isalpha(var) && isdigit(num)) { //var num                                            
            printf("enter op for if\n");
            scanf("%c", &x);
            fprintf(fc, "if(%c%c%c){\n", var, x, num);
            fprintf(fw, "error in if\n");
        } else if ((op == '>' || op == '<' || op == '=') && isdigit(num)) { //op  num
            printf("enter Variable for if \n");
            scanf("%c", &x);
            fprintf(fc, "if(%c%c%c){\n", x, op, num);
            fprintf(fw, "error in if\n");
        } else if ((op == '>' || op == '<' || op == '=')) { //op  
            printf("enter var for if.. \n");
            scanf("%c", &x);
            printf("enter number for if.... \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "if(%c%c%c){\n", x, op, y);
            fprintf(fw, "error in if\n");
        } else if (isdigit(num)) { //num
            printf("enter var for if.. \n");
            scanf("%c", &x);
            printf("enter op for if.... \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "if(%c%c%c){\n", x, y, num);
            fprintf(fw, "error in if\n");
        } else if (isalpha(var)) { //var
            printf("enter op for if.... \n");
            scanf("%c", &x);
            printf("enter number for if.. \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "if(%c%c%c){\n", var, x, y);
            fprintf(fw, "error in if\n");
        } else {
            printf("enter var for if.... \n");
            scanf("%c", &x);
            printf("enter op for if.. \n");
            scanf("%c", &y);
            scanf("%c", &y);
            printf("enter number for if.. \n");
            scanf("%c", &z);
            scanf("%c", &z);
            fprintf(fc, "if(%c%c%c){\n", x, y, z);
            fprintf(fw, "error in if\n");
        }
        for (j = i; j < strlen(matrix); j++) {
            if (matrix[j] == ' ' || matrix[j] == '\n' || matrix[j] != '}') {
                j = test(j);
                continue;
            }
            rr_par = matrix[j];
            break;
        }
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ' || matrix[i] == '\n' || matrix[i] != ';')
                continue;
            sim = matrix[i];
            break;
        }

        fprintf(fc, "};\n");
    }
    return i;
}

int test_var(int i) {
    int j, l, t;
    char var = '\0', sem = '\0', x;
    if (matrix[i] == 'v' && matrix[i + 1] == 'a' && matrix[i + 2] == 'r') {
        for (j = i + 3; j < strlen(matrix); j++) {
            if (matrix[j] == ' ' || matrix[j] == ';') {
                if (matrix[j] == ';')
                    break;
                continue;
            }
            var = matrix[j];
            break;
        }
        if (matrix[j] == ';')
            j--;
        t = j;
        for (l = j + 1; l < strlen(matrix); l++) {
            if (matrix[l] == ' ')
                continue;
            sem = matrix[l];
            break;
        }
        if (sem != ';') {
            l = i + 3;
            var = '\0';
        }
        if ((sem == ';') && isalpha(var))
            fprintf(fc, "var %c;\n", var);
        else if ((sem == ';')) {
            fprintf(fw, "var ;\n");
            printf("variable don't found please enter your character to correct\n");
            x = getchar();
            scanf("%c", &x);
            fprintf(fc, "var %c;\n", x);
        } else if (isalpha(var)) {
            fprintf(fw, "var %c\n", var);
            printf("one ; in this variable don't found press any key to correct this error\n");
            getch();
            fprintf(fc, "var %c;\n", var);
        } else {
            fprintf(fw, "var\n");
            printf("; and character don't found\n");
            printf("pleas enter your variable\n");
            x = getchar();
            scanf("%c", &x);
            fprintf(fc, "var %c;\n", x);
        }
    }
    return l;
}

int test_while(int i) {
    int j;
    char var = '\0', sim = '\0', x, y, l_par = '\0', r_par = '\0', op, num, ll_par = '\0', rr_par = '\0', z;
    if (matrix[i] == 'w' && matrix[i + 1] == 'h' && matrix[i + 2] == 'i' && matrix[i + 3] == 'l' && matrix[i + 4] == 'e') {
        for (j = i + 5; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            l_par = matrix[j];
            break;
        }
        if (l_par != '(')
            j = i + 2;
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ' || matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=' || matrix[i] == ')' || matrix[i] == '{' || isdigit(matrix[i])) {
                if (matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=' || matrix[i] == ')' || matrix[i] == '{' || isdigit(matrix[i]))
                    break;
                continue;
            }
            var = matrix[i];
            break;
        }
        if (matrix[i] == '>' || matrix[i] == '<' || matrix[i] == '=') {
            i = i - 1;
        }
        if (isdigit(matrix[i])) {
            goto after_op;
            j = j - 1;
        }
        if (matrix[i] == ')') {
            goto after_op_and_number;
            i = j - 1;
        }
        if (matrix[i] == '{') {
            goto after_op_number_rpar;
            j = j - 1;
        }
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            op = matrix[j];
            break;
        }
after_op:
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ')
                continue;
            num = matrix[i];
            break;
        }
after_op_and_number:
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            r_par = matrix[j];
            break;
        }
after_op_number_rpar:
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ')
                continue;
            ll_par = matrix[i];
            break;
        }
        if (isalpha(var) && (op == '>' || op == '<' || op == '=') && isdigit(num)) // var op num
            fprintf(fc, "while(%c%c%c){\n", var, op, num);
        else if (isalpha(var) && (op == '>' || op == '<' || op == '=')) { // var op
            printf("enter number for while \n");
            scanf("%c", &x);
            fprintf(fc, "while(%c%c%c){\n", var, op, x);
            fprintf(fw, "error in while\n");
        } else if (isalpha(var) && isdigit(num)) { //var num                                            
            printf("enter op for while\n");
            scanf("%c", &x);
            fprintf(fc, "while(%c%c%c){\n", var, x, num);
            fprintf(fw, "error in while\n");
        } else if ((op == '>' || op == '<' || op == '=') && isdigit(num)) { //op  num
            printf("enter Variable for while \n");
            scanf("%c", &x);
            fprintf(fc, "while(%c%c%c){\n", x, op, num);
            fprintf(fw, "error in while\n");
        } else if ((op == '>' || op == '<' || op == '=')) { //op  
            printf("enter var for while.. \n");
            scanf("%c", &x);
            printf("enter number for while.... \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "while(%c%c%c){\n", x, op, y);
            fprintf(fw, "error in while\n");
        } else if (isdigit(num)) { //num
            printf("enter var for while.. \n");
            scanf("%c", &x);
            printf("enter op for while.. \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "while(%c%c%c){\n", x, y, num);
            fprintf(fw, "error in while\n");
        } else if (isalpha(var)) { //var
            printf("enter op for while.. \n");
            scanf("%c", &x);
            printf("enter number for while.. \n");
            scanf("%c", &y);
            scanf("%c", &y);
            fprintf(fc, "while(%c%c%c){\n", var, x, y);
            fprintf(fw, "error in while\n");
        } else {
            printf("enter var for while.... \n");
            scanf("%c", &x);
            printf("enter op for while.. \n");
            scanf("%c", &y);
            scanf("%c", &y);
            printf("enter number for while.. \n");
            scanf("%c", &z);
            scanf("%c", &z);
            fprintf(fc, "while(%c%c%c){\n", x, y, z);
            fprintf(fw, "error in while\n");
        }
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ' || matrix[j] == '\n' || matrix[j] != '}') {
                j = test(j);
                continue;
            }
            rr_par = matrix[j];
            break;
        }
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ' || matrix[i] != ';')
                continue;
            sim = matrix[i];
            break;
        }

        fprintf(fc, "};\n");
    }
    return i;
}

int test_variable(int i) {
    int j;
    printf("[%d] %c\n", i, matrix[i]);
    char t, var = '\0', op = '\0', var1 = '\0', op1 = '\0', num = '\0', x, y, sem = '\0';
    if (isalpha(matrix[i])) {
        var = matrix[i];
        for (j = i + 1; j < strlen(matrix); j++) { //i  =   i+1  || 1  +  i  // var i;
            if (matrix[j] == ' ')
                continue;
            op = matrix[j];
            break;
        }
        if (op != '=')
            return i;
        for (i = j + 1; i < strlen(matrix); i++) {
            if (matrix[i] == ' ')
                continue;
            num = matrix[i];
            break;
        }
        if (num == ';') {
            sem = num;
            num = '\0';
            goto aftersem;
        }
        if ((num == '+' || num == '-' || num == '*' || num == '/')) {
            op1 = num;
            num = '\0';
            j = i;
            goto afterop1;
        }
        for (j = i + 1; j < strlen(matrix); j++) {
            if (matrix[j] == ' ')
                continue;
            op1 = matrix[j];
            break;
        }
        if (op1 == ';') {
            sem = op1;
            op1 = '\0';
            i = j;
            goto aftersem;
        }
afterop1:
        for (i = j + 1; i <= strlen(matrix); i++) {
            if (matrix[i] == ' ') {
                continue;
            }
            var1 = matrix[i];
            break;
        }

        if (var1 == ';') {
            sem = var1;
            var1 = '\0';
            goto aftersem;
        }
        for (j = i + 1; j <= strlen(matrix); j++) {
            if (matrix[j] == ' ') {
                continue;
            }
            sem = matrix[j];
            break;
        }// i=i+3
aftersem:
        if (isalpha(num) || isdigit(var1)) {
            t = num;
            num = var1;
            var1 = t;
        }
        if ((var == var1)&&(op1 == '+' || op1 == '-' || op1 == '*' || op1 == '/') && isdigit(num) && sem == ';')
            fprintf(fc, "%c %c %c %c %c;", var, op, var, op1, num);
        else if ((op1 == '+' && op1 == '-' && op1 == '*' && op1 == '/') && isdigit(num) && sem == ';') {
            fprintf(fw, "%c %c %c %c %c %c\n", var, op, var1, op1, num, sem);
            fprintf(fc, "%c %c %c %c %c;", var, op, var, op1, num);
        } else if ((op1 == '+' || op1 == '-' || op1 == '*' || op1 == '/') && isdigit(num)) {
            fprintf(fw, "%c %c %c %c %c %c\n", var, op, num, op1, var1, sem);
            fprintf(fc, "%c %c %c %c %c;\n", var, op, var, op1, num);
        } else if (isdigit(num)) {
            fprintf(fw, "%c %c %c %c %c %c\n", var, op, num, op1, var1, sem);
            printf("enter op for varible \n");
            scanf("%c", &x);
            fprintf(fc, "%c %c %c %c %c;\n", var, op, var, x, num);
        } else if ((op1 == '+' || op1 == '-' || op1 == '*' || op1 == '/')) {
            fprintf(fw, "%c %c %c %c %c %c\n", var, op, num, op1, var1, sem);
            printf("enter number for variable\n");
            scanf("%c", &x);
            fprintf(fc, "%c %c %c %c %c;\n", var, op, var, op1, x);
        } else {
            fprintf(fw, "%c %c %c %c %c %c\n", var, op, num, op1, var1, sem);
            printf("enter number for variable \n");
            scanf("%c", &x);
            printf("enter op for varible \n");
            scanf("%c", &y);
            fprintf(fc, "%c %c %c %c %c;\n", var, op, var1, y, x);
        }
    }
    i = j;
    return i;
}</string.h></ctype.h></stdlib.h></stdio.h>


这篇关于c语言中的文本分析器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆