主题:有做编译器的朋友,进来聊聊?!
hk18
[专家分:2230] 发布于 2005-05-08 22:40:00
[em2][em2][em2]
回复列表 (共9个回复)
沙发
简Θ单 [专家分:2360] 发布于 2005-05-20 12:36:00
本人正在做一个脚本解释器。
板凳
hk18 [专家分:2230] 发布于 2005-05-20 18:08:00
到哪个阶段了?
3 楼
简Θ单 [专家分:2360] 发布于 2005-05-21 15:36:00
AST和symbol table
4 楼
简Θ单 [专家分:2360] 发布于 2005-05-21 15:37:00
工作相当的烦琐。
5 楼
liyf001 [专家分:310] 发布于 2005-06-14 10:15:00
用什么写的?
6 楼
简Θ单 [专家分:2360] 发布于 2005-06-16 16:11:00
C
7 楼
sbjtg850926 [专家分:100] 发布于 2005-06-18 14:54:00
我是个菜鸟,请问做编译器怎么做啊,要了解哪些方面的东西 啊我对这些东西很感兴趣.
8 楼
blog [专家分:0] 发布于 2005-06-23 17:40:00
不做就不做要做就做最好的~!
9 楼
hhshg [专家分:0] 发布于 2005-06-23 19:22:00
哪位大虾能帮我解决这个词法分析器问题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;
我来回复