自定义关键字词法分析器源码实现
"词法分析器源代码" 词法分析器,又称为扫描器或词法分析程序,是编译器设计中的一个重要组成部分。它的主要任务是读取源代码中的字符流,将这些字符流转化为有意义的符号序列,即标记(Token),为语法分析阶段提供输入。在给定的源代码中,词法分析器被设计为能够识别特定数量的关键字、双字符运算符和单字符运算符。 在这个实现中,词法分析器首先定义了一个二维字符数组`keyword`,用于存储32个预定义的关键字,如"auto"、"break"等。这些关键字是编程语言中具有特殊含义的保留词汇。接着,它定义了`double_ksymbol`数组来表示15种双字符运算符,例如"->"、"++"、"--"等,这些运算符在语句中执行特定的逻辑操作。此外,`single_ksymbol`数组包含了24个单字符运算符,如","、"("、")"等,这些都是编程语言中常见的符号。 词法分析器的核心在于判断输入的字符或字符序列是否为关键字、双字符运算符或单字符运算符。源代码中提供的`is_single_ksymbol`函数用于检测单字符运算符,通过遍历`single_ksymbol`数组来查找匹配项。如果找到匹配项,该函数返回其在数组中的索引;否则返回-1。同样,`is_double_ksymbol`函数用于检查双字符运算符,通过比较输入字符串与`double_ksymbol`数组中的元素是否相等来判断。 在实际的词法分析过程中,通常还会包含处理标识符(Identifier)、常量(Constant)、字符串(String)等功能。然而,这个简单的示例仅关注了关键字和运算符的识别。在更完整的词法分析器实现中,还需要考虑如何处理空白、注释、换行以及如何构造标记对象来保存这些信息。 词法分析器的实现方式有很多种,如状态机模型(有限状态自动机,Finite State Automata)、正则表达式等。此代码采用的是一种基于数组匹配的简单方法,虽然可能不够灵活,但对于理解词法分析的基本原理来说已经足够。在编译原理和实践课程中,这样的例子常被用来教授词法分析的基础概念。对于初学者,通过分析和修改这样的源代码,可以深入理解词法分析过程及其在编程语言解析中的作用。
单词种别》》》》整形常量:itg 实型常量:rel 标示符:bsf 附加值默认为NUL,关键字为kwd,单符号位sks,双符号位dks 不被识别的双标示符:uds
单词属性》》》》整形常量:数字 实型常量:数字
------------------------------------------------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char kword[32][9]={"auto","break","char","case","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","return","register","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};
char double_ksymbol[15][3]={"->","++","--","/=","*=","-=","+=","||","&&","!=",">=","<=","==","<<",">>"}; //15
char single_ksymbol[24]={',','(',')','[',']','.','!','&','~','*','/','%','+','-','<','>','{','}','"','\\','#','%','=',';'};//21
int is_single_ksymbol(char ch)
{
int i;
for(i=0;i<25;i++)
if(ch==single_ksymbol[i])
return i;
return -1;
}
int is_double_ksymbol(char *ch)
{
int i;
for(i=0;i<15;i++)
if(!strcmp(ch,double_ksymbol[i]))
return i;
return -1;
}
int isword(char ch)
{
if((ch>='a'&&ch<='z')||ch>='A'&&ch<='Z')
return 1;
else
return 0;
}
int isnumber(char ch)
{
int i;
if(ch>='0'&&ch<='9')
return 1;
else
return 0;}
int cmpword(char *ch)
{
int i;
for(i=0;i<32;i++)
if(!strcmp(ch,kword[i]))
return i;
return -1;
}
//主函数
int main()
{
FILE *source=fopen("d:\\source.txt","r");
if(source==NULL)
{
printf("The file can't be open !");
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展