1.5数据结构
1.5.1 自身定义数据结构
1.5.1.1 charRec
string charRec; //在字符环境中,缓存所读入的字符
charRec是string类型的变量,用于缓存在字符环境中,所读入的所有字符,以便后续处理。
1.5.1.2 lineBuffer
char lineBuffer[10005]; //保存当前行的所有内容
lineBuffer是一个长度为10005的char型数组,用于保存当前行的所有内容。
1.5.1.3 lexicalErrorInformatin
vector<string> lexicalErrorInformation;//用于保存词法错误信息的列表
lexicalErrorInformatin是一个string的容器,按顺序保存所有的词法错误信息,以便后续输出。
1.5.1.4 yycolumn
int yycolumn; //表示当前符号所在某一行的具体位置(或者说列数)
1.5.2 引用外部的数据结构
1.5.2.1 yylloc
extern YYLTYPE yylloc;
YYLTYPE是YACC中用于表示终结符或非终结符的位置的结构。其默认定义如下:
typedef struct {
int first_line;
int first_column;
int last_line;
int last_column;
}
YYLTYPE;
- 其中first_line表示当前文法符号代表的内容的起始行,first_column表示当前文法符号代表的内容的起始列,last_line表示当前文法符号代表的内容的终止行,last_column表示当前文法符号代表的内容的终止列。
-
1.5.3 lex内置数据结构
1.5.3.1 yyin
FILE *yyin;
lex提供了一个FILE*类型的指针yyin,将输入文件打开后获得的文件指针赋值给yyin,即可实现从文件输入。
1.5.3.2 yytext
char *yytext;
匹配成功的单词由该指针指向,因此我们可以利用yytext获取当前匹配成功的单词。
1.5.3.3 yyleng
int yyleng;
1.5.3.4 yylineno
int yyleng;
表示当前行号。需要在LEX源程序的声明部分写入%option yylineno,开启该变量的使用。
1.5.3.5 yylval
class Type { public: string str; //记号的具体属性 string token; //记号 Type() { } } ; #define YYSTYPE Type* YYSTYPE yylval
YYSTYPE指的是YACC中各终结符号、非终结符号节点附带的属性类型,可以是一个普通变量,也可以是一个复杂的结构体。在YACC中,我们直接将其作为了语法分析树的节点类型,因此是一个较为复杂的结构类型。上述代码所展现的类Type的定义已经被简化,只留下了词法分析程序需要用到的域。
- YYSTYPE是指向Type类的指针类型。
- yylval变量起到了在词法分析程序和语法分析程序间传递信息的作用。