C语言实现的编译原理语法分析程序中语法规则的存储

一月 9th, 2007

最近在做编译原理课的语法分析词法分析等程序,遇到的第一个问题就是如何存储语法规则,我把我的想法贴出来,可能并不是很合理,不过给有兴趣的人做一个参考。


typedef struct RuleNode {
int Number;
char Left;
char * Right;
int RightNum;
int RightNumMax;
} RNode, *RNPtr;


typedef struct Rule {
int Number;
int MaxNum;
RNPtr * AllRule;
} Rule;

我使用的方法中,定义了两种结构体。

第一个是struct RuleNode,这个结构体是存储单句的语法规则的,其中包括:
int Number ——存储此句语法规则的编号(程序写到现在觉得似乎可以省略此项)
char Left ——存储“->”符号左边的表达式,我的程序比较简单,规定了这里只能是一个字母,所以用char,但是事实上应该不止一个非终结符,每个也不只一个字母,所以也许应该用char**或者cstring[]?
char * Right ——存储“->”右边的表达式,还是和上面一样规定了一个字符只能是一个字母组成,应该改成char**。
int RightNum ——存储Right指针后有几个连续空间存储字符。
int RightNumMax ——动态分配空间给Right时的空间大小,若RightNum达到这个数,就realloc。

第二个结构体是struct Rule,这个就很简单了,一个动态分配空间的数组存储指向每个规则结点的指针,另外两个是个数和最大值~

以上只是我一点不成熟的想法,希望能够对需要的人有帮助。

图形学作业——画圆

九月 17th, 2006

此文亦在“取次花丛懒回顾”发布,那里使用了coolcode插件,浏览代码可能好看一些,请点这里

今天早晨好好看了看笔记,基本理解了算法的意思,于是就动手写了一下,再稍作修改,就成功了,下面是代码的主要函数,拿出来给计算机图形学初学者共享:

void drawCircle(int xc, int yc, int r)
//By Alfred Phlower
//2006.09.17
//xc,yc为圆心坐标,r为半径
{
int x,y,k;
//x,y为当前点坐标,k为计数器
float p;
//p为决策参数

x=0;
y=r;

p=5.0/4.0-(float)r;

for(k=0;x<=y;k++)
{
drawPixel(x,y,xc,yc);

if(p<0)
{
x++;
p+=(2*x+1);
}
else
{
x++;
y--;
p+=2*x-2*y+1;
}
}
}

drawPixel()是一个写点函数,计算的是1/8圆,写点函数将算出的坐标画到八个1/2象限上。

我是在TC2.0下实现的,不过drawCircle()函数中没有调用任何库函数,所以可以用在其他地方,只要drawPixel()中调用的库函数是使用的编译环境支持的就行了。

网络方面的问题总是搞不太清楚

九月 16th, 2006

最近网络出了点问题,ADSL直接拨号时是好的,可是接上路由以后,网游QQ什么的都不受影响,偏偏有的网站没办法访问,Ping没有问题,可是直接访问IP还是访问不到,但是有的网站又不受影响,比如Blogger.com。这个症状也不是一直有,时好时坏的,捉摸不透……

打10000,接线小姐很果断地把责任推开,并且建议我们拔掉路由再试一试,拔了路由确实是好的。

现在很是郁闷,时好时坏不知道有没有必要换路由,决定先借个路由做一做实验。

到底是路由的问题还是电信对使用路由的用户作了手脚呢?TP-Link可是在最新的固件中说明“修正运营商限制路由用户的问题”了……

为什么163邮箱没有将垃圾邮件标记为非垃圾邮件的功能

九月 15th, 2006

找了找没有类似于“这不是垃圾邮件”的选项,难道只是直接将错标为垃圾邮件的邮件移动到收件箱就行了吗?以后呢?

还有一个让人郁闷的事情是163邮箱自动在信件后面增加的广告,我用163邮箱向Blogger贴Blog文章,出来的东西惨不忍睹啊……

随口抱怨而已~~~