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

原创 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);
}

编译原理实验一、实验二、实验三、实验四、实验五实验报告完整打包

  • 2009年07月22日 20:53
  • 304KB
  • 下载

编译原理 实验3 语法分析

语法分析 一、 实验目的 算术表达式的文法可以是(你可以根据需要适当改变):             E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将表达式进行语法分析,...
  • u011686226
  • u011686226
  • 2014年11月29日 19:41
  • 2547

电子科技大学-编译原理实验

实验一 一、实验名称:词法分析器的设计与实现 二、实验学时:4 三、实验内容和目的: 内容: 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 目的: 通过设计词法分析器...
  • u013589609
  • u013589609
  • 2015年08月04日 14:19
  • 2420

编译原理实验

§例4.6 DFA M=({S,U,V,Q},{a,b},f, S, {Q})其中f定义为: Øf(S,a)=U  f(V,a)=U Øf(S,b)=V  f(V,b)=Q Øf...
  • tpman07
  • tpman07
  • 2016年11月11日 15:35
  • 424

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

这次实验被“过来人”们定位很简单,实验内容如下: --------------------------------------------------------------------------...
  • liushuaikobe
  • liushuaikobe
  • 2012年10月24日 21:18
  • 9243

编译原理非递归预测分析

  • 2012年07月05日 22:49
  • 747KB
  • 下载

【编译原理】非递归的预测分析法 JAVA实现

定义一个语法分析接口public interface GrammarHandler { //用来代替空符 char NULL_WORD_CHAR = '☯'; String N...
  • a610786189
  • a610786189
  • 2017年11月12日 21:24
  • 262

编译原理语法分析器实验报告.doc版下载

  • 2009年12月14日 21:57
  • 92KB
  • 下载

聊天机器人2002

  • 2003年04月29日 00:00
  • 24B
  • 下载

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

#include #include #include #include #include #include #include #include #include #include ...
  • u013486414
  • u013486414
  • 2015年12月08日 17:00
  • 3840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理实验二——语法分析(预测分析)
举报原因:
原因补充:

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