编译原理实验二——语法分析(预测分析)

原创 2006年05月31日 19:52:00

[实验任务]
1、实现LL(1)分析中控制程序(表驱动程序);
2、完成以下描述算术表达式的LL(1)文法的LL(1)分析程序(LL(1)分析表见教材)。
G[E]:
        E→TE′
        E′→ATE′|ε
        T→FT′
        T′→MFT′|ε
        F→ (E)|i
        A→+|-
        M→*|/
     说明:终结符号i为用户定义的简单变量,即标识符的定义。
[设计要求]
1、输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。
2、LL(1)分析过程应能发现输入串出错。
3、设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。

demo.cpp

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "demo.h"

#define SIZE 100

char stack[SIZE];
int bottom = 0, top = 0;

void push(char ch) {
 if (top != SIZE) {
  stack[top] = ch;
  top++;
 }
}

char pop() {
 if (top != bottom) {
  top--;
  stack[top] = '/0';
  return stack[top];
 }

 return -2;
}

int get_id(FILE *fp) {
 char temp[100];
 int id;
 fscanf(fp, "%d", &id);
 fgets(temp, 100, fp);

 return id;
}

void translate(int id, char *a) {
 switch(id) {
 case 0:
  *a = '#';
  break;
 case 12:
  *a = 'i';
  break;
 case 22:
  *a = '+';
  break;
 case 23:
  *a = '-';
  break;
 case 24:
  *a = '*';
  break;
 case 21:
  *a = '/';
  break;
 }
}


bool is_terminate(char ch) {
 if (ch == 'i' || ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '#')
  return true;
 return false;
}

void trans(char ch, char a, int *i, int *j) {
 switch (ch) {
 case 'E':
  *i = 0;
  break;
 case 'e':
  *i = 1;
  break;
 case 'T':
  *i = 2;
  break;
 case 't':
  *i = 3;
  break;
 case 'F':
  *i = 4;
  break;
 case 'A':
  *i = 5;
  break;
 case 'M':
  *i = 6;
  break;
 }

 switch (a) {
 case 'i':
  *j = 0;
  break;
 case '+':
  *j = 1;
  break;
 case '-':
  *j = 2;
  break;
 case '*':
  *j = 3;
  break;
 case '/':
  *j = 4;
  break;
 case '(':
  *j = 5;
  break;
 case ')':
  *j = 6;
  break;
 case '#':
  *j = 7;
  break;
 }
}

void search_table(char ch, char a) {
 int i, j;
 trans(ch, a, &i, &j);
 char temp[20] = {'/0'};
 strcpy(temp, TABLE[i][j]);
 if (strcmp(temp, "~") == 0) {
  pop();
  return;
 }
 else if (strcmp(temp, "") != 0) {
  pop();
  for (unsigned ii = 0; ii < strlen(temp); ii++) {
   push(temp[ii]);
  }
  return;
 }
 else {
  printf("Error!/n");
  exit(0);
 }
}

void main() {
 FILE *in;
 int id = 0;
 char a = 0;
 in = fopen("result.txt", "r");

 push('#');
 push('E');

 id = get_id(in);
 translate(id, &a);
 while (true) {
  if (is_terminate(stack[top-1])) {
   if (stack[top-1] == a && a == '#') {
    printf("success./n");
    return;
   }
   else if (stack[top-1] == a) {
    pop();
    id = get_id(in);
    translate(id, &a);
   }
   else {
    printf("Error!/n");
    return;
   }
  }
  else if (!is_terminate(stack[top-1])) {
   search_table(stack[top-1], a);
  }
 }

 fclose(in);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

哈工大软件学院编译原理实验2——语法分析

这次实验让人煞费苦心啊,话说我已经写了一天的C语言文法了,囧。   总结一下,可以说:程序编写很帅很顺利,文法编写很挫很纠结。我用的是LL(1)分析法(又叫预测分析法),开始的时候花了一段时间来理解...

哈工大编译原理实验2——语法分析

此次试验由于指导书的文法比较简单,且没有消除左递归(我懒),因此使用学长的文法,并加上了数组判断。 S -> func funcs funcs -> func funcs funcs -> $ fun...

吉首大学_编译原理实验题_基于预测方法的语法分析程序的设计【通过代码】

一、实验要求 实验二  基于预测方法的语法分析程序的设计 一、实验目的 了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法,掌握预测语法分析程序的手工构造方法。 二、实验内容 1...

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

#include #include #include #include #include #include #include #include #include #include ...

编译原理语法分析实验(Java实现)

import java.util.Stack; public class LL1 { //加入同步符号的LL(1)分析表 private String [][] analysisTabl...

编译原理语法分析实验

  • 2015-03-25 09:18
  • 2.09MB
  • 下载

跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

文章中引用的代码均来自https://github.com/vczh/tinymoe。   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了。在正确分析"print sum...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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