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

原创 2006年06月02日 17:17:00

[实验任务]

  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;
}

相关文章推荐

编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)

概念简述移动归约分析法:自底向上的语法分析方法,也称为移动归约分析法。 最易于实现的一种移动归约分析方法,叫做算符优先分析法, 而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语...

简单算符优先文法分析程序(编译原理)

题目                       实现算符优先文法分析程序;完成对以下表达式文法的分析程序。        G[E]:             E->E+T             E...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

[编译原理]算符优先文法分析与实现

在算术表达式中,运算的优先顺序主要采用四则运算的口诀:先乘除后加减,从左算到右,这个口诀确定了乘除运算优先于加减运算,同级运算一律从左到右,即代数中的“左结合”法则。如果计算的每一步做一个运算,那么四...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

按编译原理的思路设计的一个计算器

首先看一下这个计算器的功能: 点击(此处)折叠或打开 CALC> set a = 1; b = 2 CALC> set c = 3 CALC> calc (10 + pow...

编译原理之后缀表达式生成与计算

编译原理值后缀表达式生成与计算
  • qyvlik
  • qyvlik
  • 2016年06月01日 21:23
  • 1106

粒子群算法的matlab实现

粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(Evolutionary Algorithm - EA)...

编译原理实验之语法分析(算符优先分析算法(C语言))

#include #include #include #include #include #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理实验四——算符优先文法语法分析
举报原因:
原因补充:

(最多只允许输入30个字)