最近在写编译原理实验,遇到了一些有意思的问题都写在这里。
实验中涉及的C–语法在这里

####关于yytext
yytext是一个指向当前被词法分析识别出的字符串的指针。
我们遇到的问题是,在创建语法树节点的时候,对于终结符,我们直接把一个char*的变量指向了yytext指向的值。在赋值处的打印是正确的,但是到了语法分析打印语法树的时候,会把当前结点之后所有的字符都打印出来。
这个问题后来通过开一块新空间,把新空间的值赋为yytext的值解决了。但是引起了我对yytext结构的一些思考。

用于测试的代码如下:

1
2
3
4
5
int main()
{
int i = 0123;
int j = 0x3F;
}

错误是从main()开始的,main是一个ID
当main被移入的时候,yytext指向了main的前面,此时’(‘还未读入,所以当char* subname = yytext的时候,打印出来的subname是正常的main.当移入下一个token的时候,’(‘被移入了,此时subname指向的位置还是main的前面,但是由于’(‘的读入,这个字符串整体变长了,yytext指向的是’(‘的前面。所以打印main那部时候的subname会把’(‘一起打印出来。随着终结符的移入,这个空间在慢慢变长,所以每次打印的时候都会把指针后面的所有内容都打印出来。
yytext指向输入的串

所以说,输入的串就相当与一个纸带。每移入一个终结符就在纸带后面添一个识别出的串,并且把yytext往后指一个串。