关闭

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

标签: tablesearchfpfile测试任务
6209人阅读 评论(2) 收藏 举报
分类:

[实验任务]
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);
}

0
1

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137051次
    • 积分:1891
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:9篇
    • 译文:0篇
    • 评论:48条
    文章分类