1、待分析的C语言子集的词法
1) 关键字
main if else int return void while (都是小写)
2) 专用符号
= + — * / < <= < >= = = != ; : ,{ } [ ] ( )
3) 其他标记
STRING::=” [^”]* “
ID::=letter(letter|digit)*
INT::=digit digit*
letter::= a|…|z|A|…|Z
digit::= 0|…|9
4)空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
3、词法分析程序的功能
输入:所给文法的源程序字符串
输出:二元组(syn, token或sum)构成的序列。其中syn 为单词种别码;token 为存放的单词自身字符串;sum为整型常量(作为常量的值)。实现时,可将单词的二元组用结构进行处理
源.cpp
//输入:源程序字符串 所给文法的
//扫描子程序
//输出:单词种别码syn 字符串token/整型常量sum
//关键字(小写)--关键字表,否--一般字符
//初始化-->忽略空格/注释-->文件结束?-->判断字母?数字?运算符、界符等?其他符号-报错
//字母:拼接,关键字?否-syn=10,对应关键字的种别码
//数字:拼接,syn=20,
//符号:为不同符号给出相应的syn值,,,其它error!
#include "code.h"
int main() {
char buf[4048] = { '0' };//扫描缓冲区
//预处理,去掉注释
pro_process(buf);
cout << buf<<endl;
ofstream cout_file("Lex_r.txt", ios::out);
code_val t;
//扫描子程序
do{
t = scanner(buf);//依次扫描一个单词二元式
//printf("%s\t%d", t.code,t.val);
cout << t.code << '\t' << t.val << endl;
cout_file << t.code << '\t' << t.val << endl;//写入文件Lex_r
} while (t.code !&