C#词法分析自动生成器
前言
在做编译原理实验时,要求使用自动生成器生成词法分析器,老师推荐的是用flex,
但用flex只会生成C代码,自己项目用的又是C#,本来想使用C代码直接生成dll库并用C#调用,
但非常麻烦。干脆找了个能生成C#代码的生成器。
配置
相关的生成器很多,但我能找到的且能成功使用的也就是Gplex了,
这是作者的源码地址
先决条件:
Visual Studio 2022
按以下步骤进行:
1、首先,打开VS,创建项目或打开你已有的项目。右键项目,点击管理Nuget程序包。
2、点击浏览,搜索YaccLexTools,并将其安装到项目中。
3、依次展开依赖项-包-YaccLexTools-文档,可以看到一个Readme文档,这里作者给出了它的博客地址:https://devnotes.ernstc.net/yacclextools
4、作者博客里给出了概述和一个示例,但这里我简要的说明一下使用方法。右键项目添加一个后缀为.lex的文件,用于编写lex源代码,这里我随便写个示例。关于lex文件具体的编写方法,请看查阅文档
%namespace ConsoleApp1
%scannertype LexerScanner
%visibility internal
%tokentype Tag
%option noparser, noembedbuffer
%{
%}
Number [0-9]+
%%
{Number} { return 0; }
%%
%namespace: lex文件编译后会生成一个cs文件,这是定义它的命名空间,这里我就用项目默认的命名空间。
%scannertype: 定义词法分析器类的名字。
%visibility: 定义该类的可见性。
%tokentype:定义Token枚举的名称,随便写就行。
%option:定义编译的选项,这里我要求不生成语法分析器(只生成词法分析器),以及没有嵌入的缓冲区类。
%{ %}: 里面书写你的C#代码。
接着书写你的正则表达式定义
在%% %%之间写识别到正则的操作,这里我返回了0,实际可以返回Token值,或是调用函数。
5、写完lex源码后,右键项目,点击编辑项目文件,插入以下代码:
<ItemGroup>
<LexFile Include="a.lex">
<OutputFile>a.cs</OutputFile>
</LexFile>
</ItemGroup>
LexFile里的include你的lex文件的位置,outuputfiles写输出的文件名。
项目文件如这样:
6、运行你的项目即可,会自动生成词法分析器的cs文件。
查阅文档
作者的源码地址里面有一个gplex.pdf文件,这是gplex的使用文档。
文档中稍微重要的部分:
以及