编译原理实验四——算符优先文法语法分析

来源:互联网 发布:dedecms美女图片源码 编辑:程序博客网 时间:2024/04/28 00:31

[实验任务]

  1、实现算符优先分析算法。

2、完成以下描述算术表达式的算符优先文法的算符优先分析过程。

G[E]:EE+TE-TT  

         TT*FT/FF

         F(E)i

说明:终结符号i为用户定义的简单变量,即标识符的定义。

 

[设计要求]

1、构造该算符优先文法的优先关系矩阵或优先函数;

2、输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。

3、算符优先分析过程应能发现输入串出错。

4、设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。

opg.cpp

main() {
 memset(stack, '/0', sizeof(stack));
 char buffer[100];
 char a = 0;
 int tail_buffer = -1, head_buffer = -1;
 int tail_stack = 0, head_stack = 0;
 FILE *in;
 in = fopen("result.txt", "r");

 push('#');
 translate(get_id(in), &a);
 push(a);
 while (true) {
  if (stack[top-1] != '#') {
   translate(get_id(in), &a);
   push(a);
  }
  filter(buffer);
  for (unsigned i = 0; i < strlen(buffer) - 1; i++) {
   int m, n;
   m = get_index(buffer[i]);
   n = get_index(buffer[i+1]);
   if (strcmp(TABLE[m][n], ">") == 0) {
    tail_buffer = i;
    break;
   }
  }
  if (tail_buffer < (int)strlen(buffer) && tail_buffer != -1) {
   for (int j = i; j > 0; j--) {
    int m, n;
    m = get_index(buffer[j-1]);
    n = get_index(buffer[j]);
    if (strcmp(TABLE[m][n], "<") == 0) {
     head_buffer = j;
     break;
    }
   }
   int num = 0;
   bool head_flag = false, tail_flag = false;
   for (i = 0; i < strlen(stack); i++) {
    if (head_buffer == num) {
     if (is_terminate(stack[i]))
      head_stack = i;
     else
      head_stack = i+1;
     head_flag = true;
    }
    if (tail_buffer == num) {
     if (is_terminate(stack[i]))
      tail_stack = i;
     else
      tail_stack = i+1;
     tail_flag = true;
    }
    if (head_flag && tail_flag) {
     break;
    }
    if (is_terminate(stack[i])) {
     num++;
    }
   }
   
   if (head_stack != 0 && !is_terminate(stack[head_stack-1])) {
    head_stack = head_stack-1;
   }
   if (tail_stack != (int)strlen(stack)-1 && !is_terminate(stack[tail_stack+1])) {
    tail_stack = tail_stack+1;
   }
   
   gui_yue(head_stack, tail_stack);
   tail_buffer = -1;
   head_buffer = -1;
   tail_stack = 0;
   head_stack = 0;
  }

  if (strcmp(stack, "#A#") == 0) {
   printf("success./n");
   break;
  }
 }

 fclose(in);

 return 0;
}