zoukankan      html  css  js  c++  java
  • 作业五

    词法分析程序(Lexical Analyzer)要求:

    - 从左至右扫描构成源程序的字符流

    -  识别出有词法意义的单词(Lexemes

    -  返回单词记录(单词类别,单词本身)

    -  滤掉空格

    -  跳过注释

    -  发现词法错误

     

    程序结构:

    输入:字符流(什么输入方式,什么数据结构保存)

    处理:

    –遍历(什么遍历方式)

    –词法规则

    输出:单词流(什么输出形式)

    –二元组

     

    单词类别:

    1.标识符(10)

    2.无符号数(11)

    3.保留字(一词一码)

    4.运算符(一词一码)

    5.界符(一词一码)

     

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    <

    20

    while

    4

    <=

    21

    do

    5

    <>

    22

    end

    6

    >

    23

    l(l|d)*

    10

    >=

    24

    dd*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

    #include<stdio.h>

    #include<string.h>

    #include<stdlib.h>

    char prog[800],token[20];//程序段,单词符号

    char ch,error;

    int syn,p,m,n,sum;//单词符号类型syn,整数sum,p当前要识别程序段第一个字符指针p

    char *word[6]={"begin","if","then","while","do","end"};

    int main(){

     p=0;

     printf(" 请输入程序段(注意以#号结束)");

     do{

      ch=getchar();

      prog[p++]=ch;

     } while(ch!='#');

     p=0;

     do{

      ch=prog[p++];

     switch(ch){

      case '+':

       syn=13;token[0]=ch;

       break;

      case '-':

       syn=14;token[0]=ch;

       break;

      case '*':

       syn=15;token[0]=ch;

       break;

      case '/':

       syn=16;token[0]=ch;

       break;

      case ':':

       syn=17;token[0]=ch;

       break;

       case ':=':

       syn=18;token[0]=ch;

       break;

       case '<':

       syn=19;token[0]=ch;

       break;

       case '<=':

       syn=20;token[0]=ch;

       break;

       case '<>':

       syn=21;token[0]=ch;

       break;

       case '>':

       syn=22;token[0]=ch;

       break;

       case '>=':

       syn=23;token[0]=ch;

       break;

       case '(':

       syn=24;token[0]=ch;

       break;

       case ')':

       syn=25;token[0]=ch;

       break;

      case '#': //逐个字符读入,放入字符数组prog中,直到'#'停止

       for(int i=0;i<20;i++)

        token[i]=NULL;

       syn=0;token[0]=ch;

       break;

      default:

       if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//标识符

        m=0;

        while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){

         token[m++]=ch;

         ch=prog[p++];

        }

        token[m++]='';

        p--;

        syn=10;

        for(int i=0;i<6;i++){

         if(strcmp(word[i],token)==0){

          syn=i+1;

          break;

         }

        }

       }else if((ch>='0'&&ch<='9')){//数字

        sum=0;

        while(ch>='0'&&ch<='9'){

         sum=sum*10+(ch-'0');

         ch=prog[p++];

        }

        p--;

        syn=11;

        

       }else if(ch==' '){//空格直接

        ch=prog[p];

        syn=100;

        

       }else{

        int n=p-1;

        syn=-1;

        error=prog[n];

       }

       break;

      

      }

      switch(syn){

       case 100:

        break;

       case 11:

        printf(" (%d,%d)",syn,sum);

        break;

       case -1:

        printf(" '%c'符号!",error);

        break;

       default:

        printf(" (%d,%s)",syn,token);

        break;

      }

     }while(syn!=0);

    }

    截图如下:

     

  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/xuechendong/p/11656176.html
Copyright © 2011-2022 走看看