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

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

算术表达式的合法性判断与求值(上)

在写一个计算器时遇到了一个问题,就是对字符串表示的算术表达式的合法性判断与求值。下面记录一下我的解决方案。 一、问题描述 问题:给定一个字符串,只包含 '+'、'-'、'*'、'/'、数字、小数点...

算术表达式的合法性判断与求值(下)

上一篇讲到,通过编译原理的方法(词法分析和语法分析)来判断字符串表示的算术表达式的合法性。这一篇,接着讲在算术表达式合法的情况下,对表达式进行求值。 问题:给定一个字符串,只包含 '+'、'-'...

编译原理之算术表达式文法的预测分析算法c实现

已知表达式文法:        E

编译原理-LL(1)预测分析实验 c源代码

   编译原理实验--LL(1)预测分析,根据LL(1)文法,写出各文法左部的FIRST集 FOLLOW集 SELECT集.然后根据SELECT集 写出预测分析表.本程序是在SELECT集建立后,程序...
  • oDon
  • oDon
  • 2006年11月22日 19:25
  • 5200

Delphi7高级应用开发随书源码

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

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

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

Delphi7高级应用开发随书源码

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

编译原理 实验3 语法分析

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

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

编译原理值后缀表达式生成与计算(2)
  • qyvlik
  • qyvlik
  • 2016年06月01日 21:36
  • 911

编译原理 实验3 递归下降语法分析程序设计

实验目的】        练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高语法分析方法的实践能力 【实验要求】     利用某一高级程序设计语言构造语法分...
  • niu91
  • niu91
  • 2013年06月23日 16:05
  • 15955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理实验二——语法分析(预测分析)
举报原因:
原因补充:

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