Pascal语言子集词法分析器

原创 2005年04月25日 22:49:00

有空再来写注释^o^

测试用Pascal代码片断
begin
 ab2a:=9;
 if x>=0 then x:=x+1;
 while a=0 do
  b:=a*x/33455;
 end
#

---------------------------------------------------------------------
测试结果
syn     |value
________|________
1       |begin
10      |ab2a
18      |:=
11      |9
26      |;
2       |if
10      |x
24      |>=
11      |0
3       |then
10      |x
18      |:=
10      |x
14      |+
11      |1
26      |;
4       |while
10      |a
25      |=
11      |0
5       |do
10      |b
18      |:=
10      |a
16      |*
10      |x
17      |/
11      |33455
26      |;
6       |end
0       |#
Press any key to continue

分析器的C代码------------------------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WD_LEN 255
#define MAX_INT 32767
#define MAX_SRC_LEN 1000
#define MAX_WD_CNT 100
#define KWD_CNT 6
/************************************************/

union value_type{
       int d;
       char c;
       char s[MAX_WD_LEN];
};

typedef struct{
       int syn;
       union value_type value;
}word_type;

/************************************************/
char *keywords[20]={"begin","if","then","while","do","end"};
char source[MAX_SRC_LEN];
word_type word_stack[MAX_WD_CNT];
int line=1,wtop=0,ip=0;

/************************************************/
void p_word_stack(){
       int i;word_type w;
       printf("syn/t|value/n");
       printf("________|________/n");
       for(i=0;i<wtop;i++){
               w=word_stack[i];
               if( (w.syn>=1 && w.syn<=10) || w.syn==18 || w.syn==21 || w.syn==22
|| w.syn==24)
                       printf("%d/t|%s/n",w.syn,w.value.s);
               else if(w.syn==11)
                       printf("%d/t|%d/n",w.syn,w.value.d);
               else
                       printf("%d/t|%c/n",w.syn,w.value.c);
       }
       return ;
}
void tell_err(){
       printf("error in line %d/n",line);
       exit(1);
       return ;
}
void scan(){
       word_type w;
       char c;
       int j=0;
       if(isdigit(c=source[ip])){
               w.syn=11;   /* dd*  */
               w.value.d=c-'0';
               while(isdigit(c=source[++ip]))
                       w.value.d=w.value.d*10+c-'0';
      if(!isalpha(c))
      word_stack[wtop++]=w;
      else
      tell_err();
               return;
       }
       if(isalpha(c=source[ip])){
               w.syn=10;    /*  (ll|d) */
               w.value.s[0]=c;
               while(isalpha(c=source[++ip]) || isdigit(c))
                       w.value.s[++j]=c;
               w.value.s[j+1]='/0';
               for(j=0;j<KWD_CNT;j++){
                       if(strcmp(keywords[j],w.value.s)==0)
                               w.syn=j+1;
               }
               word_stack[wtop++]=w;
               return ;
       }
       switch(c=source[ip]){
               case '+' :
                       w.syn=14;  /* '+' */
                       w.value.c='+';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case '-' :
                       w.syn=15; /* '-' */
                       w.value.c='-';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case '*' :
                       w.syn=16;  /* '*' */
                       w.value.c='*';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case '/' :
                       w.syn=17;
                       w.value.c='/';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case ':' :
                       w.syn=19;
                       w.value.c=':';
                       if( (c=source[++ip]) !='='){
                               word_stack[wtop++]=w;

                       }
                       else if(c=='='){
                               strcpy(w.value.s,":=");
                               w.syn=18;
                               word_stack[wtop++]=w;
                               ip++;
                       }
                       break;
               case '<' :
                       w.syn=20;
                       w.value.c='<';
                       if( (c=source[++ip]) !='>' && c!='='){
                               word_stack[wtop++]=w;
                       }
                       else if(c=='>'){
                               w.syn=21;
                               strcpy(w.value.s,"<>");
                               word_stack[wtop++]=w;
                               ip++;
                       }
                       else if(c=='='){
                               w.syn=22;
                               strcpy(w.value.s,"<=");
                               word_stack[wtop++]=w;
                               ip++;
                       }
                       break;
               case  '>' :
                       w.syn=23;
                       w.value.c='>';
                       if( (c=source[++ip]) !='='){
                               word_stack[wtop++]=w;
                       }
                       else if(c=='='){
                               w.syn=24;
                               strcpy(w.value.s,">=");
                               word_stack[wtop++]=w;
                               ip++;
                       }
                       break;
               case '=' :
                       w.syn=25;
                       w.value.c='=';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case ';' :
                       w.syn=26;
                       w.value.c=';';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case '(' :
                       w.syn=27;
                       w.value.c='(';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case ')' :
                       w.syn=28;
                       w.value.c=')';
                       word_stack[wtop++]=w;
                       ip++;
                       break;
               case ' ' :
                       while(source[++ip]==' ');
                       break;
               case '/n' :
                       line++;
                       while(source[++ip]=='/n')line++;
                       break;

               case '/t' :
                       while(source[++ip]=='/t');
                       break;
               case '/r' :
                       while(source[++ip]=='/r');
                       break;
               default:
                       tell_err();
       }
       return;
}
int main(){
       FILE* fp;
       int i=0;
       word_type w;
       fp=fopen("input.txt","r");
       while(!feof(fp))
               source[i++]=getc(fp);
       fclose(fp);
       while(source[ip]!='#')
               scan(ip);
       w.syn=0;
       w.value.c='#';
       word_stack[wtop++]=w;
       p_word_stack();
}

用C语言写的Pascal语言词法分析器

虽然只是个词法分析器,但是重拾C语言好难!好久没用过C了。放在这儿勉励自己做事一定要有始有终/*Trans.c -main,Trans */#include #include #include #...
  • hammerwoo
  • hammerwoo
  • 2006年04月19日 14:40
  • 2009

Pascal语言子集词法分析器

  编译原理实验实战 作者: falcon   发表日期: 2006-04-07 17:47   ...
  • wangjiaoni
  • wangjiaoni
  • 2007年05月28日 13:04
  • 1730

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

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

编译原理:C语言词法分析器

编译原理的实验:完成对C++语言的词法分析 先说一下整体框架: 基类:Base  封装了一些基础的字符判断函数,如下: int charkind(char c);//判断字符类型 int spa...
  • NK_test
  • NK_test
  • 2016年04月25日 22:09
  • 7713

基于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
  • 1023

C语言子集的词法分析器

C语言子集的词法分析器实现1 实习目标这次将使用C++ 实现C语言子集的词法分析器,该词法分析器能够识别: -各种关键字,包括while,for,switch,case,if,else -标识符:...
  • brother_mao
  • brother_mao
  • 2016年12月26日 14:52
  • 109

深入浅出编译原理-4-一个简单词法分析器的C语言实现

引言 光说不练,假把式。 此小节来做一个实验,用c语言自己实现一个简单的词法分析器,来加深对词法分析的理解。感兴趣的就自己分析一下源码吧,挺简单的,就没画流程图,请见谅。闲言少叙,我们开始吧。 ...
  • rill_zhen
  • rill_zhen
  • 2012年07月06日 17:07
  • 16335

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

词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。 要实现的词...
  • ben_xiao_hai
  • ben_xiao_hai
  • 2014年08月13日 12:29
  • 3644

c语言词法分析器的简单实现

前不久编译原理学习了词法分析,自己实现了一个简单的c语言词法分析器,来加深对词法分析器原理,状态转换图,有限自动机的理解。当我们想在电脑上运行一个c语言程序时,都要将源程序进行编译。编译简单来说就是将...
  • hjh_walker
  • hjh_walker
  • 2016年11月04日 21:24
  • 3316

java实现C语言子集的语法分析器

如题,只是做一个算法的演示,所以并不能识别C语言全部的关键字,像int 等关键字会被识别为标识符。可以按照自己需求自行扩充保留字表。 程序功能: 词法分析器从input文件中读入一小段C语言源程序,以...
  • sinat_32092165
  • sinat_32092165
  • 2016年11月25日 17:57
  • 835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Pascal语言子集词法分析器
举报原因:
原因补充:

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