【编译原理】词法分析(自定义标识符、常数、关键字、界符识别)代码实现 您所在的位置:网站首页 c程序自定义标识符 【编译原理】词法分析(自定义标识符、常数、关键字、界符识别)代码实现

【编译原理】词法分析(自定义标识符、常数、关键字、界符识别)代码实现

2023-11-21 11:38| 来源: 网络整理| 查看: 265

1.前言

本篇博客实现一个编译原理的词法分析器,能够识别用户自定义标识符、常数、字符串、关键字、界符。

词法分析包括:用户自定义标识符、常数、字符串、关键字、界符的识别。用户自定义符号,顾名思义就是自己定义的变量名;函数名,常数包括整数、浮点数、科学计数;字符串包括‘ ’、" "两种形式的字符串;关键字就是程序内置的关键字,如int、main等;界符就是各类符号,如运算符、{}、[]等。

词法分析的任务是,给定输入,识别输入序列中的单词,并将其正确分类。对于重复出现的单词,应该保证唯一性。

词法分析说容易也容易,人一眼就可以看出来一个”词“是属于哪一类的,然而让计算机来做就需要抽象出规则。常用的词法分析处理思路就是使用DFA,这在常数识别上体现得淋漓尽致。

2.代码实现 2.1 Word类型

Word类型是原字符序列经过分析后得到的单词序列。其中val值(整数\浮点)是为了日后计算,在这里没有使用。

/** * kind:识别种类 id:序号 name:自定义名|字符串|字符 val:常数值 * */ struct Word { int kind; string name = ""; int val1; double val2; } word_list[1000]; 2.2 Token类型

Token类型是符号表的数据结构类型。符号表采用链表的数组实现。

struct Token { int kind, id;//单词类型,单词序号 string tkval = "";//单词字符串值 Token *next = NULL; } token_list[7]; //0号不用,1-6分别表示6种不同单词类型

 kind类型:1--用户自定义标识符,2--字符,3--字符串,4--常数,5--关键字,6--界符。

2.3 用户自定义标识符识别&关键字识别

之所以这二者同时做,是因为自定义标识符和关键字的识别很像,但是自定义标识符要避免与关键字的冲突。因此,二者结合来识别就很有必要。检查方式就是首先识别单词,再在Token链表里查关键字那栏有没有这个单词。

/** * 标识符识别(用户自定义标识符1、关键字5) */ string judgeIdt(char &ch, ifstream &infile) { string str = ""; while (((ch >= 'a' && ch = 'A' && ch = '0' && ch > ch; } return str; } void judge(string word) { if (ch == '_' || (ch >= 'a' && ch = 'A' && ch > ch; while (ch != '\'' && !infile.eof()) { str = str + ch; infile >> ch; } str = str + ch; infile >> ch; cout ch; cout ch; } else if (ch == '.') { state = 2; str += ch; infile >> ch; } else { state = 7; flag = true; } break; case 2: if (ch >= '0' && ch > ch; } break; case 3: if (ch == 'e' || ch == 'E') { state = 4; str += ch; infile >> ch; } else if (ch >= '0' && ch > ch; } else { flag = true; } break; case 4: if (ch == '+' || ch == '-') { state = 5; str += ch; infile >> ch; } else if (ch >= '0' && ch > ch; } break; case 5: if (ch >= '0' && ch > ch; } break; case 6: if (ch >= '0' && ch > ch; } if (ch < '0' || ch > '9') { state = 7; } break; case 7: flag = true; break; } if (flag) break; } cout > ch; } if (ch == '=') { str = str + ch; infile >> ch; } return str; } 2. 7 主控程序

这部分主要实现根据判断条件进行子程序的调用、输入文件、输出结果。

int main() { string fileName; char ch; //当前读入符号 cout fileName;//确保文件在路径下 ifstream infile; infile.open(fileName.data()); assert(infile.is_open()); infile >> noskipws; infile >> ch; initTKList(); printf("The filtered words are as follows:\n"); while (!infile.eof() && ch != EOF) { if (ch == '_' || (ch >= 'a' && ch = 'A' && ch


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有