自制编译器:词法分析器

本文介绍了如何创建一个词法分析器,它解析程序源文件,识别出词素并传递给语法分析器。词法分析器处理的词素包括关键字、运算符、标识符、数字、字符串常量等。作者提到了特定的规则,如处理比较和位运算符的组合,并展示了简单的数据结构和分隔符处理。通过实例化词素并检查输出结果,验证了词法分析器的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


词法分析器代码已上传到个人资源中。

当我们的程序源文件进入编译器,首先遇到的就是词法分析器。

词法分析器的作用就是解析源文件,分析出其中的词素,并把这个词素的顺序集输入给语法分析器。

接上篇把所谓的词素也就是终结符号列出来:

if else while ( ) { } cpreop bitop logiop armtcop number literal id NUL new [ ] basetype class private public static return break continue . this

其中cprop包括 > < >= <= == != 即比较运算符

bitop 为位运算符,包括<< >> & | ^

logiop 逻辑运算符 包括 && ||

armtcop 算数运算符 包括 + - * /

number 数字常量 例如12345整形火 1.2345小数

id 标识符 按java规则

literal 字符串常量 如"ROgerwong"

NUL 空串

basetype 基本类型 包括 int char double 三种

当然,为了简单,在这里并不打算讨论非确定有穷自动机和确定有穷自动机的理论以及其之间的转换算法,只是用最朴素的方法,不断的将字符读入缓冲区,然后和这些词素进行比较,然后把这个词素加入到一个ArrayList中。

按着这个方法定义几个数据结构:

定义词素数据结构,共含两个域,1个表示类型,一个表示具体的值,类型的取值也已经标出。

package ravaComplier.lexer;

public class Lexeme {  public int type;  public Object value;  public Lexeme(int t,Object v)  {   type=t;   value=v;  }  @Override  public String toString()  {   return new String("<"+type+":"+value.toString()+">");  }    public static int IF=0;//if  public static int ELSE=1;//else  public static int WHILE=2;//while  public static int BRACKET=3;//各种括号  public static int CPREOP=4;//比较符号  public static int BITOP=5;//位操作符  public static int LOGIOP=6;//逻辑运算符  public static int ARMTOP=7;//算术运算符  public static int NUMBER=8;//立即数  public static int LITERAL=9;//字符串  public static int ID=10;//id  public static int NUL=11;//空  public static int NEW=12;//new 操作符  public static int BASETYPE=13;//基本数据类型  public static int CLASS=14;//关键字class  public static int ACCESSFLAG=15;//public 或者private  public static int STATIC=16;//关键字static  public static int RETURN=17;//关键字return  public static int BREAK=18;//break  public static int CONTINUE=19;//continue  public static int DOT=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值