yosys深入研究和演示(2) --- flex词法分析
来源:硬件电路设计与研究 发布时间:2024-05-23 分享至微信

在EDA软件设计中,比如我们可以针对yosys,我们可以自己设计一个frontend,以实现c/c++到verilog的转换,此时我们就需要自己来设计一套编译器,编译器的词法生成器有各种不同,常见的有LL(k)、LALR....,比如javacc就是非常有名的LL(k)生成器,flex/lex则是LALR(1)生成器,一般针对c/c++编译器,可以使用flex/bison来做词法\语法语义解析器的生成器设计。选择flex\lex与bison\yacc来生成词法解析器与语法解析器是非常不错的选择。然而,这两个工具虽然用起来简单,但对于新手来说,入门还有着些许的难度。本次推文就是针对新手,介绍flex的概念和使用。


一、在linux下一般都会缺省安装flex的,否则可以手动安装:apt install flex



二、程序编译简单说,就是把一种设计表述形式转换翻译为另外一种表述形式,比如我们可以把C语言表述的程序翻译转换为汇编语言表述,把C语言表述的逻辑翻译为verilog语言表述(即HLS综合).....,这其中需要做到基本各种包括:将原始表述分隔成有意义的单元(即Token),然后找出这些单元之间的关系和语义;其中第一步工作(即将原始表述分隔成有意义的单元Token),叫词法分析,不同的语言有自己不同的词法分析要求,完成自己特殊词法分析要求的程序叫词法分析器,手工自己写一个词法分析器程序是个很繁琐的工作,那么能不能用另外一个工具,根据不同需求自动生成一个词法分析器?答案是肯定的,而lex/flex就是一个这样的工具,lex/flex所做的工作就是生成词法分析器,那么具体咋做?


首先我们需要写一个.l后缀的文件,以定义和告诉flex如何分析词法,词法分析的规则是什么,如何分析的规则都是用正则表达式来描述的(关于正则表达式见前面推文),这个.l后缀的文件的结构如下:


定义(definations)
%%
规则(rules)
%%

代码(user code)



flex的代码分为三个部分,由%%分割,这些部分可以为空,但为了大家便于理解,一个具体示例如下:


%{
#define T_WORD 1
int numChars = 0, numWords = 0, numLines = 0;
%}

WORD([^ \t\n\r\a]+)

%%
\n{ numLines++; numChars++; }
{WORD}{ numWords++; numChars += yyleng; return T_WORD; }
<<EOF>>{ return 0; }
.{ numChars++; }
%%

int main() {
int token_type;
while (token_type = yylex()) {
printf("WORD:\t%s\n", yytext);
}
printf("\nChars\tWords\tLines\n");
printf("%d\t%d\t%d\n", numChars, numWords, numLines);
return 0;
}

int yywrap() {
return 1;
}


①第一部分即定义,较原框架加入了%{ %},这对大括号内可以加入C语言的各种定义,加入这对大括号的目的是,在这个部分可以使用C语言代码进行预处理,例如定义宏、常量等等,当然也可加入头文件,比如加入#include<stdio.h>。


②第二部分即%% 与%%间的内容,这是重点内容,是正则表达式描述的词法解析规则:


第二部分由多条规则(rule)组成,每条rule可以由patternaction组成。
pattern使用正则表达式表示,含义为需要匹配的词的规则。
action使用代码表示,含义为成功匹配该词后执行的动作。


以下是常见的flex中的pattern参考,具体也可参考以前推文,在此重复列出,一方面是其很重要,另一方面是让大家每天多看偶微信公众号几分钟



将此文件另存为word.l。注意此文件中的%{%}必须在本行的最前面(前面不能有空格),同时,注意%}不要写成}%了。在终端输入:

flexword.l

gcc -o word lex.yy.c

./word<test_mem.v


flexword.l就是用flex工具根据我们定义的规则,生成词法分析程序lex.yy.c

gcc -o word lex.yy.c就是把生成的词法源程序编译为可执行程序

./word<test_mem.v就是用生成的自定义词法分析程序对源程序test_mem.v做个词法分析,并打印输出结果


yosys深入研究与演示(1)


yosys深入研究和演示(2) --- 正则表达式


开源综合工具Yosys(1)


yosys(2)



[ 新闻来源:硬件电路设计与研究,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!