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 <iostream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    using namespace std;
     
    //关键字 
    string key[6]={"main","int","if","else","while","do"}; 
    int keyNum[6]={1,2,3,4,5,6}; 
     
    string symbol[17]={"<",">","!=",">=","<=","==",",",";","(",")","{","}","+","-","*","/","="};
    int symbolNum[17]={7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
    string letter[1000];
    string words[1000];
    int length; 
    int num;
     
    int isSymbol(string s){
     int i;
     for(i=0;i<17;i++){
      if(s==symbol[i])
       return symbolNum[i]; 
     }
     return 0;
     
     
    bool isNum(string s){
     if(s>="0" && s<="9")
      return true;
     return false;
    }
     
     
    bool isLetter(string s)
    {
     if(s>="a" && s<="z")
      return true;
     return false;
    }
     
    int isKeyWord(string s){
     int i;
     for(i=0;i<6;i++){
      if(s==key[i])
       return keyNum[i];
     }
     return 0;
    }
     
     
    int typeword(string str){
     if(str>="a" && str<="z") // 字母 
      return 1;
     
     if(str>="0" && str<="9") //数字 
      return 2;
     
     if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"
      ||str=="+"||str=="-"||str=="*"||str=="/") 
      return 3; 
     
    }
     
    string identifier(string s,int n){
     int j=n+1;
     int flag=1;
     
     while(flag){
      if(isNum(letter[j]) || isLetter(letter[j])){
       s=(s+letter[j]).c_str();
       if(isKeyWord(s)){
        j++;
        num=j;
        return s;
       }
       j++;
      }
      else{
       flag=0;
      }
     } 
     
     num=j;
     return s;
    }
     
    string symbolStr(string s,int n){
     int j=n+1;
     string str=letter[j];
     if(str==">"||str=="="||str=="<"||str=="!") {
      s=(s+letter[j]).c_str();
      j++;
     }
     num=j;
     return s;
    }
     
    string Number(string s,int n){
     int j=n+1;
     int flag=1;
     
     while(flag){
      if(isNum(letter[j])){
       s=(s+letter[j]).c_str();
       j++;
      }
      else{
       flag=0;
      }
     }
     
     num=j;
     return s;
    }
     
    void print(string s,int n){
     cout<<"("<<s<<","<<n<<")"<<endl;
    }
     
    void TakeWord(){ 
     int k;
     
     for(num=0;num<length;){
      string str1,str;
      str=letter[num];
      k=typeword(str);
      switch(k){
       case 1:
        {
         str1=identifier(str,num);
         if(isKeyWord(str1))
          print(str1,isKeyWord(str1));
         else
          print(str1,0);
         break;
        }
     
       case 2:
        {
         str1=Number(str,num);
         print(str1,24);
         break;
        }
     
       case 3:
        {
         str1=symbolStr(str,num);
         print(str1,isSymbol(str1));
         break; 
        }
     
      }
     
     } 
    }
     
    int main(){
     char w;
     int i,j;
     
     freopen("s.txt","r",stdin);
     freopen("result.txt","w",stdout); 
     
     length=0;
     while(cin>>w){
      if(w!=' '){
       letter[length]=w;
       length++;
      }
     }
     
     TakeWord();
     
     fclose(stdin);
     fclose(stdout);
     return 0;
    }

    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    using namespace std;

    //关键字 
    string key[6]={"main","int","if","else","while","do"}; 
    //关键字的种别码
    int keyNum[6]={1,2,3,4,5,6}; 
    //运算符和界符 
    string symbol[17]={"<",">","!=",">=","<=","==",",",";","(",")","{","}","+","-","*","/","="};
    //char symbol[12]={'<','>','!=','>=','<=','==',',',';','(',')','{','}'};
    //运算符和界符的种别码 
    int symbolNum[17]={7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
    //存放文件取出的字符 
    string letter[1000];
    //将字符转换为单词
    string words[1000];
    int length; //保存程序中字符的数目 
    int num;

    int isSymbol(string s){ //判断运算符和界符 
    int i;
    for(i=0;i<17;i++){
    if(s==symbol[i])
    return symbolNum[i]; 
    }
    return 0;


    //判断是否为数字 
    bool isNum(string s){
    if(s>="0" && s<="9")
    return true;
    }

    //判断是否为字母 
    bool isLetter(string s)
    {
    if(s>="a" && s<="z")
    return true;
    }

    //判断是否为关键字,是返回种别码 
    int isKeyWord(string s){
    int i;
    for(i=0;i<6;i++){
    if(s==key[i])
    return keyNum[i];
    }
    return 0;
    }

    //返回单个字符的类型 
    int typeword(string str){
    if(str>="a" && str<="z") // 字母 
    return 1;

    if(str>="0" && str<="9") //数字 
    return 2;

    if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"
    ||str=="+"||str=="-"||str=="*"||str=="/") //判断运算符和界符 
    return 3; 

    }

    string identifier(string s,int n){
    int j=n+1;
    int flag=1;

    while(flag){
    if(isNum(letter[j]) || isLetter(letter[j])){
    s=(s+letter[j]).c_str();
    if(isKeyWord(s)){
    j++;
    num=j;
    return s;
    }
    j++;
    }
    else{
    flag=0;
    }


    num=j;
    return s;
    }

    string symbolStr(string s,int n){
    int j=n+1;
    string str=letter[j];
    if(str==">"||str=="="||str=="<"||str=="!") {
    s=(s+letter[j]).c_str();
    j++;
    }
    num=j;
    return s;
    }

    string Number(string s,int n){
    int j=n+1;
    int flag=1;

    while(flag){
    if(isNum(letter[j])){
    s=(s+letter[j]).c_str();
    j++;
    }
    else{
    flag=0;
    }
    }

    num=j;
    return s;
    }

    void print(string s,int n){
    cout<<"("<<s<<","<<n<<")"<<endl;
    }

    void TakeWord(){ //取单词 
    int k;

    for(num=0;num<length;){
    string str1,str;
    str=letter[num];
    k=typeword(str);
    switch(k){
    case 1:
    {
    str1=identifier(str,num);
    if(isKeyWord(str1))
    print(str1,isKeyWord(str1));
    else
    print(str1,0);
    break;
    }

    case 2:
    {
    str1=Number(str,num);
    print(str1,24);
    break;
    }

    case 3:
    {
    str1=symbolStr(str,num);
    print(str1,isSymbol(str1));
    break; 
    }

    }


    }

    int main(){
    char w;
    int i,j;

    freopen("input.txt","r",stdin);
    freopen("result.txt","w",stdout); //从控制台输出,而不是文本输出

    length=0;
    while(cin>>w){
    if(w!=' '){
    letter[length]=w;
    length++;
    } //去掉程序中的空格
    }

    TakeWord();
    // for(j=0;j<length;j++){
    // cout<<letter[j]<<endl;
    // } 

    fclose(stdin);//关闭文件 
    fclose(stdout);//关闭文件 
    return 0;
    }

  • 相关阅读:
    Navicat工具破解
    ios7开发者必知
    浏览器工作原理
    Lettcode_104_Maximum Depth of Binary Tree
    LeetCode:Balanced Binary Tree
    error: openssl/md5.h: No such file or directory
    欢迎来到Swift天地(Welcome to Swift)
    最大子阵列和
    【Cocos2d-x Lua】数据库封装类型的操作
    python于lxml应用
  • 原文地址:https://www.cnblogs.com/zlkang/p/11656272.html
Copyright © 2011-2022 走看看