1.5数据结构

1.5.1 自身定义数据结构

1.5.1.1 charRec

  1. string charRec; //在字符环境中,缓存所读入的字符

charRec是string类型的变量,用于缓存在字符环境中,所读入的所有字符,以便后续处理。

1.5.1.2 lineBuffer

  1. char lineBuffer[10005]; //保存当前行的所有内容

lineBuffer是一个长度为10005的char型数组,用于保存当前行的所有内容。

1.5.1.3 lexicalErrorInformatin

  1. 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变量起到了在词法分析程序和语法分析程序间传递信息的作用。