回 帖 发 新 帖 刷新版面

主题:有做编译器的朋友,进来聊聊?!

[em2][em2][em2]

回复列表 (共9个回复)

沙发

本人正在做一个脚本解释器。

板凳

到哪个阶段了?

3 楼

AST和symbol table

4 楼

工作相当的烦琐。

5 楼

用什么写的?

6 楼

C

7 楼

我是个菜鸟,请问做编译器怎么做啊,要了解哪些方面的东西 啊我对这些东西很感兴趣.

8 楼

不做就不做要做就做最好的~!

9 楼

哪位大虾能帮我解决这个词法分析器问题1.  给出一简单语言单词符号的种别编码单词符号    种别编码
begin         1
if            2
then          3
while         4
do           5
end          6
l ( l | d ) *     10
dd *          11
+            13
–           14
*            15
/             16
:             17
:=            18
<             20
<>            21
<=           22
>             23
>=            24
=             25
;              26
(              27
)              28
#               0
要求:输入是源程序字符串,以‘#’ 结束。输出是单词符号的二元组
( 单词种别码, 单词自身字符串 )
即      ( syn , token 或 sum )
已给出伪代码如下:
# include  <stdio.h> 定义 I / O库所用的某些宏和变量
# include  <string.h> 定义 字符串库函数
char   prog[80], token[8] ;
char   ch ;
int  syn, p, m, n ,sum ;
char   *rwtab[6]={ “begin”, “if ”, “then”, “while”,  “do” ,“end” };
main( )
    { p=0 ;
       printf( “\n please input  string : \n” ) ;
       do  { ch=getchar( );
                prog[p++]=ch ;
              } while ( ch!=‘#’);
P=0;
do
  {  scaner();
      switch(syn)
          { case 11:  printf (“(%2d,%8d)\n”,syn,sum); break;
             case –1:  printf(“input error\n”);  break;     
             default:   printf (“(%2d,%8s)\n”,syn,token);
   } while (syn!=0);
}
scaner( )
    {  for ( n=0; n<8; n++ ) token[n]=NULL;
        ch=prog[p++] ;
        while (ch==‘ ‘)  ch=prog[p++] ;
if  (  ch 是字母字符 )
      { while ch 为字母字符或数字字符
             { ch => token ;
                读下一个字符 ;   
              }
         token[m++]=‘\0’ ;   p-- ;   syn=10 ;
         for (n=0 ;   n<6 ;  n++ )
            if  ( strcmp( token, rwtab[n])= =0)
               {  给出 syn 值;
                   break ;
                }
       }
   else   
if  (  ch 是数字字符 )
{  while ch 为数字字符
      { sum=sum*10+ch-’0’;
         读下一个字符 ;   
      }
      p-- ;   syn=11;
}
else
   switch(ch)
      {
case '<':
    m=0; token[m++]=ch;
    ch=prog[p++];
    if (ch=='>')
    {  syn=21;
        token[m++]=ch;
    }
    else if (ch=='=')
           {  syn=22;
               token[m++]=ch;
                 }
    else { syn=20;
              p--;
          }
         break;
case ‘>':
    ch => token ;
    读下一个字符 ;
    if (ch=='=')
    {将>=的种别码=>syn;
            ch => token ;
    }
    else
    { 将>的种别码=>syn ;
           p--;
     }
        break;
case ':':
    ch => token ;
    读下一个字符 ;
    if (ch=='=')
    { 将:=的种别码=>syn;
              ch => token ;
    }
    else
    { 将:的种别码=>syn ;
            p--;
     }
        break;
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=0;  token[0]=ch; break;
default:
    syn= -1;  



我来回复

您尚未登录,请登录后再回复。点此登录或注册