本次的内容主要是通过c语言实现简单的词法分析器,所以理论方面的知识较少,在大家有了编译原理的基础知识后,提供代码学习。
使用语言:C语言
编译环境:vscode
编译原理总框:
一、什么是词法分析器
词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
通俗理解:我们可以联想到英语句子,假如给我们一串英语句子,这个时候我们要提取每一个单词,就是词法分析器的作用。语法分析器就调用词法分析器,来实现对每个单词的解释翻译。
二、设计词法分析器
简述:主要是数字,字符串(标识符和关键字),运算符,边界符等。数字以数字开头,一一识别,将字符通过asc码转数字提取;关键字由于有限通过枚举的方式保存,通过判断字母串满匹配确定,而字符串不是关键字,则为标识符;其他特殊符号则是直接编码提取,根据有限的特性。
对照表如下:
三、c语言代码实现
大家在了解了词法分析器后,结合代码学习效果更佳。
c语言代码如下:
#include<stdio.h>
#include<string.h>
char input[200]; //存放输入字符串
char token[5]; //存放构成单词符号的字符串
char ch; //存放当前读入字符
int p; //input[]下标
int fg; //switch标记
int num; //存放整型值
// 二维字符数组,存放关键字
char index[6][6]={
"begin","if","then","while","do","end"};
// 词法分析方法申明
void scaner();
int main()
{
p=0;
printf("please intput string(End with '#'):\n");
// 循环读入字符
do {
ch=getchar();
input[p++] = ch;
} while( ch!='#' );
p=0;
do {
scaner();
switch