1.7函数和过程
1.7.1 自身定义函数或过程
1.7.1.1 添加词法错误信息
函数接口
void addLexicalErrorInformation(char *word, string info, int l, int r);
返回值
void
- 参数列表 | 参数 | 描述 | | —- | —- | | char *word | 当前单词指针 | | string info | 具体错误信息 | | int l | 起始列数 | | int r | 终止列数 |
- 函数伪代码
void addLexicalErrorInformation(char *word, string info, int l, int r) {
按照1.5.2.1 {
loc
}
中指示的格式将参数提供的信息组装成一条完整的、结构化的错误信息
lexicalErrorInformation.push_back(错误信息)
}
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个字符。