创造新语言(2)——用Lex&Yacc构建简单的分析程序

本文介绍如何利用Lex(flex)和Yacc(bison)创建一个简单的分析程序,处理BNF语法并转化为可识别的代码结构。首先讲解了Lex如何编写词法分析器,匹配C风格字符串和注释,然后介绍了Yacc如何定义BNF语法结构。最后,文章提到了添加主处理函数以及使用cmake构建项目的过程。
摘要由CSDN通过智能技术生成

这里写图片描述
昨天我们开始设计了一门新语言,制定了基本的开发架构,今天我们就先来了解一下,两个非常好用的工具,编译器前端构建的神器——Lex&Yacc,这两个工具在linux下叫做flex和bison。

Lex是词法分析器构建工具,我们安装对应的词法规则书写,那么就能够为我们生成对应的词法分析器,自动帮我们分好token,而分词工作,一直是编译系统的基础任务。

我们今天,先来尝试编写一个BNF语法的解析器,将我们的BNF解析成代码可以识别的数据格式,BNF的格式大概是这样:

{
   { do_init() }}

# 定义列表
<definelist> = <definelist> <define> | e ;
<define> = <constdef> | <vardef> | <functiondef> ;

# 变量和常量定义
<constdef> = "const" <const_def_run>  <vardef> {
   { isconstdef = false }} ;
<vardef> = "int" <iddeflist> ";" ;
<iddeflist> = <iddeflist> "," <iddef> | <iddef> ;

这里就是我们的原始输入文件了,我们希望将其解析成为内存中的树结构,供我们的编译器使用,目前的任务就是,读入这样的文本,解析成树状结构。

这里我们可以发现,这种定义方式就是扩展BNF范式,而其中添加了语义动作的脚本{ { }},脚本也可以单独使用,用来做一些初始化工作等。

利用词法分析程序处理单词

我们先看一下基本的Lex扫描器如何编写:

/* scanner.l */
%{

#include <stdio.h>
#include "parser.hpp"

#define SAVE_TOKEN yylval.str = yytext
extern "C" int yywrap() { return 1; }

%}

/* show the line number */
%option yylineno

%%

"/*"([^\*]|(\*)*[^\*/])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值