编译原理实验一——简单词法分析

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

[实验任务]
完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。
<标识符>→字母︱ <标识符>字母︱ <标识符>数字
    <无符号整数>→数字︱ <无符号整数>数字
    <单字符分界符> →+ ︱- ︱* ︱; ︱(︱)
    <双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>*
    <小于>→<                   
<等于>→=
<大于>→>
<冒号> →:
<斜竖> →/
该语言的保留字 :begin  end  if  then  else  for  do  while  and or not   说明: 1 该语言大小写不敏感。
     2 字母为a-z A-Z,数字为0-9。
3可以对上述文法进行扩充和改造。
4 ‘/*……*/’为程序的注释部分。
[设计要求]
1、给出各单词符号的类别编码。
2、词法分析程序应能发现输入串中的错误。
3、词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件。
4、设计两个测试用例(尽可能完备),并给出测试结果。 

demo.cpp

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

char token[20];

int lookup(char *token) {
 for (int i = 0; i < 11; i++) {
  if (strcmp(token, KEY_WORDS[i]) == 0) {
   return i+1;
  }
 }

 return 0;
}

char getletter(FILE *fp) {
 return tolower(fgetc(fp));
}

void out(FILE *fp, int c, char *value) {
 fprintf(fp, "%d,%s/n", c, value);
}

void report_error(FILE *fp, char ch) {
 fprintf(fp, "There must be some error./n");
 fprintf(fp, "%c.../n", ch);
 fprintf(fp, "^/n");
}

void scanner(FILE *infile, FILE *outfile) {
 char ch;
 int i, c;
 do {
  do {
   ch = getletter(infile);
  } while(isspace(ch));
  if (isalpha(ch)) {
   token[0] = ch;
   ch = getletter(infile);
   i = 1;
   while (isalnum(ch)) {
    token[i] = ch;
    i++;
    ch = getletter(infile);
   }
   token[i] = '/0';
   fseek(infile, -1, 1);
   c = lookup(token);
   if (c == 0) {
    out(outfile, ID, token);
   }
   else {
    out(outfile, c, " ");
   }
  }
  else {
   if (isdigit(ch)) {
    token[0] = ch;
    ch = getletter(infile);
    i = 1;
    while (isdigit(ch)) {
     token[i] = ch;
     i++;
     ch = getletter(infile);
    }
    token[i] = '/0';
    fseek(infile, -1, 1);
    out(outfile, INT, token);
   }
   else {
    switch(ch) {
    case '<':
     {
      ch = getletter(infile);
      if (ch == '=') {
       out(outfile, LE, " ");
      }
      else if (ch == '>') {
       out(outfile, NE, " ");
      }
      else {
       fseek(infile, -1, 1);
       out(outfile, LT, " ");
      }
      break;
     }
    case '=':
     {
      out(outfile, EQ, " ");
      break;
     }
    case '>':
     {
      ch = getletter(infile);
      if (ch == '=') {
       out(outfile, GE, " ");
      }
      else {
       fseek(infile, -1, 1);
       out(outfile, GT, " ");
      }
      break;
     }
    case ':':
     {
      ch = getletter(infile);
      if (ch == '=') {
       out(outfile, FU, " ");
      }
      else {
       fseek(infile, -1, 1);
       out(outfile, MAO, " ");
      }
      break;
     }
    case '/':
     {
      ch = getletter(infile);
      if (ch == '*') {
       out(outfile, ZHU, " ");
      }
      else {
       fseek(infile, -1, 1);
       out(outfile, XIE, " ");
      }
      break;
     }
    case '+':
     {
      out(outfile, JIA, " ");
      break;
     }
    case '-':
     {
      out(outfile, JIAN, " ");
      break;
     }
    case '*':
     {
      out(outfile, CHEN, " ");
      break;
     }
    case ';':
     {
      out(outfile, FEN, " ");
      break;
     }
    case '(':
     {
      out(outfile, ZUO, " ");
      break;
     }
    case ')':
     {
      out(outfile, YOU, " ");
      break;
     }
    default:
     {
      if (ch != EOF) {
       report_error(outfile, ch);
      }
      break;
     }
    }
   }
  }
 } while(ch != EOF);

 return;
}

void main() {
 FILE *in, *out;

 in = fopen("pascal.txt", "r");
 out = fopen("result.txt", "w");

 scanner(in, out);
 fprintf(out, "0,#");

 fclose(in);
 fclose(out);

 printf("Finished!/n");
}

实验吧web之简单的sql注入1

0x.部分题解 一、通过加英文单引号1‘ ,检测到存在注入:   php?id=1   二、按常规步骤输入1 and 1=1和1 and 1=2的时候,发现报了“SQLi deteced...
  • Everywhere_wwx
  • Everywhere_wwx
  • 2017年05月06日 19:56
  • 2689

嵌入式实验(二)

1、编译U-boot         这一步中没有什么太大的问题,注意要在/opt/workspace/u-boot-03.00.01.06下打开终端,输入命令ls u-boot.bin,否则找不到文...
  • Kelsey98
  • Kelsey98
  • 2017年12月04日 09:04
  • 18

imagej软件分析划痕实验(计算划痕面积及伤口愈合百分比)

Traditional method for scratch wound closure 通常统计的是划痕的面积随着时间的变化,以及伤口愈合的百分比。 ...
  • u013035197
  • u013035197
  • 2017年10月31日 15:41
  • 544

操作系统实验四——文件系统的简单命令的设计与实现

要求: 实现文件系统的简单命令,此篇文件实现命令:cp。cp 是copy的缩写,使用格式为cp srcname dstname; 说明:此文件系统使用c++实现,我们要实现cp命令,大概分这几步:...
  • dzn9966
  • dzn9966
  • 2014年12月17日 23:04
  • 1148

【机器学习实验】用Python进行机器学习实验

概要本文是用Python编程语言来进行机器学习小实验的第一篇。主要内容如下: 读入数据并清洗数据 探索理解输入数据的特点 分析如何为学习算法呈现数据 选择正确的模型和学习算法 ...
  • JasonDing1354
  • JasonDing1354
  • 2015年03月12日 16:42
  • 3018

Hadoop基础教程-第8章 Zookeeper(8.2 Zookeeper下载与安装)(草稿)

第8章 Zookeeper8.2 Zookeeper安装与配置8.2.1 Zookeeper下载Zookeeper官网:http://zookeeper.apache.org 在首页“Gettin...
  • chengyuqiang
  • chengyuqiang
  • 2017年06月27日 18:06
  • 449

实验吧简单的sql注入之3WP

就上图不说话(sqlmap) 这种题目对于初学sqlmap的人还是很好玩的...
  • yalecaltech
  • yalecaltech
  • 2017年03月19日 21:15
  • 677

【实验四】独立看门狗实验

一、实验目的 1)了解独立看门狗的; 2)学会使用独立看门狗; 3)通过WK_UP来喂狗,然后通过DS0提示复位状态。 二、STM32独立看门狗简介 单片机系统在外界的干...
  • Cowena
  • Cowena
  • 2016年01月22日 09:52
  • 902

王爽汇编语言课程设计1

王爽汇编语言课程设计1
  • github_37149026
  • github_37149026
  • 2017年01月02日 20:09
  • 184

【实验一】跑马灯实验

一、实验目的 通过控制战舰STM32开发板上的两个LED灯:DS0和DS1交替闪烁,实现类似跑马灯的效果。 二、STM32 IO简介 STM32 的每个 IO 端口都有 ...
  • Cowena
  • Cowena
  • 2016年01月21日 20:35
  • 1603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理实验一——简单词法分析
举报原因:
原因补充:

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