目录
一.题目
如源程序为C语言,输入如下一段:
main()
{
int a=-5, b=4, j;
if(a>=b)
j=a-b;
else
j=b-a;
}
输出以下二元序列:
其中,序号分别意味着:
二.问题分析
分两步走:
1.将语句分成若干单独的元素. 这个问题是最关键的.
2.将每个元素分门别类,输出.
分词子问题:
在遍历字符串( 一行代码 )的过程中,遇到空格、换行符、tab、限界符、单独的运算符, 分词
遇到字母或数字, 不分词.
为了实现这一效果,设立
一个 char 类型的变量,时刻指向readline字符串中的下一个字符
同时建立各个判别函数,如IsBlock() IsSymbol() 等.
对代码文件的每一行,都有:
三.代码实现
1.头文件 & 类的声明
using namespace std;
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
class LexicalAnalysis
{
public:
LexicalAnalysis(); //构造&析构是空函数
~LexicalAnalysis();
void GetFilename(ifstream& filename); //打开文件
void InputFile(ifstream& file); //输入文件,,分析经Segment处理的curtoken向量
void Segment(string str); //将字符串(一行)分为独立的词,不涉及词性分析
//分词,将字符串分为若干段 ( 不包括空格符 ) ,存入curtoken[]
bool IsBlock(string); //换行,空格,制表符. 应当分词
bool IsSymbol(string); //是运算符,分隔符等. 应当分词
//词性分析
bool IsKey(string); //关键字
bool IsConsts(string); //常数
bool IsOperator(string); //操作数
bool IsBorder(string); //限界符
private:
vector <string> token; //暂存一个个字符,用于分词
string temp; //暂存当前token的全部字符,作为curtoken的一个元素
vector<string>curtoken; //暂存一个个分好的词,用于之后的词性分析
};
2.各种判断函数
一通分类判断完以后,剩下的只可能是变量名:由字母