Legend Since 1984
Cruising between Fantasy and Reality...

Sunday, June 18, 2006

Done with Array

傍晚搞定了变量赋值了,对于与数组有关的部分也于今晚12点左右完成了。相应的,文法产生式也进行了修改。为数组引用添加了一个新的非终结符——Array_reference,与之有关的产生式为:

  • Array_reference->IDENTIFIER [ Expression ]
  • Array_reference->Array_reference [ Expression ]

同时赋值也有重新考虑。必须区分左值和右值。对于左值,只能是变量名和数组引用;而右值,除了这两种,还可以有常量、函数调用、四则算术表达式等——这些都包含在非终结符Expression的运算符层次结构中。

  • Statement->Left_value = Expression ;

上式为赋值表达式的文法,Expression的层次为:

  • Expression->Expression + Term
  • Expression->Expression - Term
  • Expression->Term
  • Term->Term * Factor
  • Term->Term / Factor
  • Term->Factor
  • Factor->( Expression )
  • Factor->CONSTANT
  • Factor->Left_value
  • Factor->Function_caller
  • Left_value->IDENTIFIER
  • Left_value->Array_reference

为了保证代码简洁并提高其重用性,将Left_value放到Factor之下是恰当而合理的。

对于归约IDENTIFIER的地方都要去查看符号表,以确定该变量名是否被定义。而为了支持引用函数外部的,需要为每个符号表添加一个指向其父表parentTable指针。全局符号表的parentTable为NULL。查找变量的时候先搜索当前的符号表,失败的话在逐层向外进行搜索,如果都没找到变量定义才作失败处理。而这些符号表直接的父子关联关系(即parentTable的赋值)是在建立符号表的时候就予以正确的完成了。

其实,有了parentTable这个指向父表的指针之后,原先的那个为支持函数递归定义而添加存放符号表栈可以只用一个符号表引用/指针来代替了。这个引用的作用时记录当前定义、引用变量时填、查符号表的起点。开始的时候该引用指向全局符号表,这样外部的全局变量就记录在全局符号表中;每注册一个函数(Register->epsilon)时该引用指向新建的符号表,使函数体内的局部变量可以记录在局部符号表中;每当一个函数的定义结束时,用当前符号表的parentTable指针取代当前符号表引用即可。

Labels:

0 Comments:

Post a Comment

<< Home