C 模拟词法分析

原创 2004年09月23日 13:38:00

#include<iostream.h>
#include<fstream.H>
#include<stdlib.h>
#include<string.h>

bool letter(char);
bool digit(char);
char keyword[7][7]={"begin","end","if","then","else","while","do"};
char character;  //字符变量,存放最新读进的源程序字符
char token[50];
bool flags; //字符数组,存放构成单词符号的字符串

bool putchar()
{
 cout<<"您是否是把代码文件写入了analyze.dat文件中?[y(Y)/n(N)]..."<<endl;
 char get1;
 cin>>get1;
 if(get1=='Y'||get1=='y')
 {
  return true;
 }
 else
 {
  return false;
 }
}
//-----------------------
void getbc()
{
 if(character==' '||character==char(10))
 {  
  if(strlen(token)!=0)
  {
   for(int k=0;k<7;k++)
   {
    int a;
   if(strlen(keyword[k])>strlen(token))
    a=strlen(keyword[k]);
   else
    a=strlen(token);
    if (!strncmp(keyword[k],token,a))
    {
     cout<<"< "<<token<<" , 保留字>"<<endl;
     flags=false;
     goto Loop;
    }
   }
   if(!strncmp("+",token,1)||!strncmp("-",token,strlen(token)))
   {
    cout<<"< "<<token<<" , 算术运算符>"<<endl;
    flags=false;
    goto Loop;
   }
    else if(!strncmp("<",token,1)||!strncmp("<=",token,strlen(token))||!strncmp("=<",token,strlen(token))||!strncmp("<>",token,strlen(token))||!strncmp("=",token,strlen(token))||!strncmp(">=",token,strlen(token))||!strncmp(">",token,strlen(token)))
   {
    cout<<"< "<<token<<" , 关系运算符>"<<endl;
    flags=false;
    goto Loop;
   }
    else if(!strncmp(":=",token,2))
    {
     cout<<"< "<<token<<" , 赋值运算符>"<<endl;
     flags=false;
    goto Loop;
   }
     else if(!strncmp(":",token,strlen(token)))
    {
     cout<<"< "<<token<<" , 冒号>"<<endl;
     flags=false;
    goto Loop;
   }
      else if(!strncmp(";",token,strlen(token)))
    {
     cout<<"< "<<token<<" , 分号>"<<endl;
     flags=false;
    goto Loop;
   }
      else if (!strncmp(")",token,strlen(token)))
      {
        cout<<"< "<<token<<" , 右括号>"<<endl;
     flags=false;
    goto Loop;
      }
       else if (!strncmp("(",token,strlen(token)))
      {
        cout<<"< "<<token<<" , 左括号>"<<endl;
     flags=false;
    goto Loop;
      }
    else
    {
     if (flags==true)
     {
      cout<<"< "<<token<<", 数>"<<endl;
      flags=false;
      goto Loop;
     }else
       cout<<"< "<<token<<", 标示符>"<<endl;
     flags=false;
      goto Loop;
    }  
Loop:       for(int j=strlen(token);j>=0;j--)
    token[j]='/0';    
  }
 }
 else if(digit(character))
 {
       token[strlen(token)]=character;
    if(strlen(token)==1)
    {
    flags=true;
    }
 }
 else if(letter(character))
 { 
   token[strlen(token)]=character;
 }
 else
  token[strlen(token)]=character;
}


bool letter(char character1)
{
 if(((char(97)<=character1)&&(character1<=char(122)))||((char(65)<=character1)&&(character1<=char(90))))
  return true;
 else
  return false;
}


bool digit(char character1)
{
 if((char(48)<=character1)&&(character1<=char(57)))
  return true;
 else
  return false;
}

void main()
{
 bool one;
 one=putchar();
 if(one==false)
 {
  cout<<"请准备好了代码再运行此文件"<<endl;
 }
 else
 {
  fstream infile;
  infile.open ("analyze.dat",ios::in);
  char ch;
  while(infile.get (ch))
  {
   character=ch;
   getbc();
  }
  int tmp;
  cin>>tmp;
 }
}

说明:单词间要有空格!

小C语言--词法分析程序

小C语言--词法分析程序 Time Limit: 1000MS Memory Limit: 5000KB Problem Description 小C语言文法  1. →(){} 2. →|| ...
  • guoqingshuang
  • guoqingshuang
  • 2016年09月21日 17:58
  • 4685

纯C实现的词法分析和lex实现的词法分析的对比

(一):写在前面在上面的学习当中,我们通过简单的lex例子,进一步扩展lex例子,通过和yacc的融合来进行简单英语语法分析。通过这几个例子,使我们深深的感受到lex和yacc的方便和强大功能。我们最...
  • hongbochen1223
  • hongbochen1223
  • 2016年01月15日 14:03
  • 1466

小C语言--词法分析程序

小C语言--词法分析程序 Time Limit: 1000MS Memory Limit: 5000KB Submit Statistic Problem Description 小C语言文法...
  • zheng__jun
  • zheng__jun
  • 2016年09月29日 22:05
  • 3688

PL/0 词法分析器设计 c语言

【实验内容】 用C余元编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序风格成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常熟以及界符)输...
  • Double2hao
  • Double2hao
  • 2016年04月20日 15:46
  • 2975

一个简单词法分析器的C语言实现

一个简单词法分析器的C语言实现 1.1实验描述 例如:对源程序: begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,...
  • chenglinhust
  • chenglinhust
  • 2013年06月13日 14:07
  • 7404

基于C++的C语言词法分析器

#include #include #include using namespace std; char ch =' '; string key[12]={"int","continue","i...
  • Tomi_En
  • Tomi_En
  • 2015年07月10日 10:11
  • 965

Java编写的C语言词法分析器

Java编写的C语言词法分析器                      这是java编写的C语言词法分析器,我也是参考很多代码,然后将核心代码整理起来,准备放在QQ空间和博客上,目的是互相...
  • u014427391
  • u014427391
  • 2015年05月24日 16:07
  • 1789

Python词法分析器实现

简单Python词法分析器简单实现:词法分析器状态转换图:词法分析器总流程图:预处理程序:词法分析器:词法分析器程序详细设计#!/usr/bin/env python3.4 # coding=utf-...
  • IT_DREAM_ER
  • IT_DREAM_ER
  • 2016年12月06日 12:36
  • 1227

词法分析☞正则表达式

正则表达式
  • baidu_31497293
  • baidu_31497293
  • 2016年10月14日 00:49
  • 900

关于词法分析的一点总结

学完词法分析,有点乱,稍微整理下整个过程 下面我们都是以c语言为例, 我们首先明确词法分析要做的是什么,词法分析是将字符流转化为记号流,字符流就是一行行的代码,如if(a > 10), a++, wh...
  • wyt734933289
  • wyt734933289
  • 2016年10月28日 11:56
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C 模拟词法分析
举报原因:
原因补充:

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