1.7函数和过程

1.7.1 自身定义函数或过程

1.7.1.1 添加词法错误信息

  • 函数接口

    1. void addLexicalErrorInformation(char *word, string info, int l, int r);
  • 返回值

void

  • 参数列表 | 参数 | 描述 | | —- | —- | | char *word | 当前单词指针 | | string info | 具体错误信息 | | int l | 起始列数 | | int r | 终止列数 |
  • 函数伪代码
    1. void addLexicalErrorInformation(char *word, string info, int l, int r) {
    2. 按照1.5.2.1 {
    3. loc
    4. }
    5. 中指示的格式将参数提供的信息组装成一条完整的、结构化的错误信息
    6. lexicalErrorInformation.push_back(错误信息)
    7. }

1.7.1.2 检查长度限制

  • 函数接口

    bool CheckAndAddLengthTooLargeErrorInformation(char *text, string type, int l, int r)
    
  • 返回值

     bool,true表示检测到长度超过限制的错误,false表示没有检测到长度超过限制的错误
    
  • 参数列表 | 参数 | 描述 | | —- | —- | | char *text | 当前单词 | | string type | “line”表示检测行长度,”identifier”表示检测标识符长度 | | int l | 起始列 | | int r | 终止列 |

  • 函数伪代码
    bool CheckAndAddLengthTooLargeErrorInformation(char *text, string type, int l, int r) {
      if(type=="line") {
          if(当前行长度>10000) {
              按照1.5.2.2 {
                  loc
              }
              中说明的格式将已有的信息组织成一条结构化的错误信息;
              lexicalErrorInformation.push_back(错误信息);
              return true;
          }
          return false;
      } else {
          //type=="identifier"
          if(当前标识符长度>100) {
              按照1.5.2.3 {
                  loc
              }
              中说明的格式将已有的信息组织成一条结构化的错误信息;
              lexicalErrorInformation.push_back(错误信息);
              return true;
          }
          return false;
      }
    }
    

1.7.1.3 初始化终结符的位置信息

这是一个宏,而不是一个函数。

  • 宏名

     YY_USER_ACTION
    
  • 需要用到的变量列表 | 变量 | 描述 | | —- | —- | | YYLTYPE yylloc | 当前单词的位置信息,该类型的定义见1.4.2.1{loc} | | int yycolumn | 当前列数 | | int yyleng | 当前单词的长度 |

  • 伪代码

    yylloc.first_line = yylineno;
    yylloc.last_line = yylineno;
    yylloc.first_column = yycolumn;
    yylloc.last_column = yycolumn+yyleng-1;
    yycolumn += yyleng;
    
  • 备注

     该宏会自动执行,不需要自行调用。另外yycolumn的值需要在翻译规则中进行初始化,每次遇到换行符时都要初始化为1。
    

    1.7.2 引用的外部函数或过程

    1.7.2.1 将整型数字转化为字符串

  • 函数接口

    extern string itos(int num);
    
  • 返回值

     string,表示转化后的字符串
    
  • 参数列表 | 参数 | 描述 | | —- | —- | | int num | 需要转化的整型数字 |

1.7.3 lex内置函数或过程

1.7.3.1 yywrap

int yywrap();

这一函数在文件(或输入)的末尾调用。返回值类型为int,如果函数的返回值是1,就停止解析。因此它可以用来解析多个文件。方法是使用yyin 文件指针指向不同的文件,直到所有的文件都被解析。最后,yywrap()可以返回1来表示解析的结束。我们的编译器只支持同时编译一个文件,因此只需简单的将yywrap的实现写成如下的形式:

int yywrap() {
    return 1;
}

1.7.3.2 yylex

int yylex();

该函数由是lex提供给外部程序的接口,返回值类型为int。如果返回值是0,就表示当前文件分析结束,如果返回值是非0,就对应了某个记号的编号。所以对于语法分析程序来说,其返回值就是记号。因此,语法分析程序可以不断的调用该程序获得记号序列,直到其返回值为0。

1.7.3.3 yyless

yyless(n)表示将当前所识别的单词的后yyleng-n个字符退回,留作后续匹配分析,仅保留其前n个字符。