如何创建Lexer / Parser?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建Lexer / Parser?相关的知识,希望对你有一定的参考价值。

使用过:Visual Studio-2019

要安装ANTLR,我要使用-tunnelvisionlabs/antlr4cs // Github.com

我在这里接受了语法-antlr/grammars-v4 // Github.com语法:-CSharpLexer.g4;-CSharpParser.g4;-CSharpPreprocessorParser.g4;

我做了:1.安装了ANTLR;2.创建一个WinFrom应用程序;3.增加语法;在解决方案资源管理器中右键单击项目或文件夹,然后选择AddExisting Element

问题。如何创建Lexer / Parser?这些说明说应该创建其他类,但是不会发生。

enter image description hereenter image description hereenter image description hereenter image description here


更新1。

我做了:1.我关闭了Visual Studio 2019;2.我在Visual Studio 2017中打开了该项目;3.我删除了文件:-CSharpLexer.g4;-CSharpParser.g4;-CSharpPreprocessorParser.g4;4.单击“添加新项”;5.我选择了“ ANTL 4 Lexer”;注意:“ VS-2019”中没有“ ANTL”模板。6.我将名称设置为“ CSharpLexer”;7.我点击“添加”;8.结果:-VS创建了一个文件-CSharpLexer.g4;-VS创建了一个文件-CSharpLexer.g4.cs;-为文件CSharpLexer.g4的VS设置属性“对程序集的操作“ =“ Antlr4”。

问题。更新1。1.我说的对吗?2.在哪里可以获取数据来填写文件CSharpLexer.g4?我可以从链接中的文件CSharpLexer.g4中获取数据吗?https://github.com/antlr/grammars-v4/tree/master/csharp?3.是否以相同方式创建文件“ CSharpParser.g4”,“ CSharpPreprocessorParser.g4”?4.文件使用什么模板-“ CSharpPreprocessorParser.g4”?

enter image description hereenter image description here

答案

通过将Antlr软件包(包括一个语法文件)添加到VS项目中并构建该项目,输出文件(词法分析器/解析器)将在与语法文件位于相同的文件夹中自动生成。

然后您应该使用VS“添加现有项”将生成的CS文件添加到您的项目中,以便可以将它们编译为“ C#”文件。

另一答案

如果您无法通过@NirMH的建议进行测试,我强烈建议您首先尝试使用Java运行时,因为Java是ANTLR项目中的第一个公民。 https://github.com/antlr/antlr4/blob/master/doc/targets.md

无论您选择哪种目标语法(在C#中为目标语法),用Java运行时生成ANTLR4结果都比任何其他语言都稳定。我已经用JS,C#和Python生成器进行了测试,但是它们都不够稳定。 stable意味着,在非Java解析期间,您可能会遇到一个永恒的循环。

当然,您可以使用Java ANTLR运行时解析C#文件。要生成词法分析器/解析器文件,请演练the tutorial。生成的结果是普通的.java文件,因此您应该从它们创建自己的jar库文件。

我同意整个过程不是一键解决所有问题,但是语言处理总是很脏。

要在WinForm中调用jar,可以使用IKVM nuget包,如下所述将jar转换为dll,然后将dll添加到WinForm项目中。

C:ikvmc.exe -target:library csharp-lexer-parser.jar

以上是关于如何创建Lexer / Parser?的主要内容,如果未能解决你的问题,请参考以下文章

Antlr4 Can‘t load Hello as lexer or parser

Antlr4 Can‘t load Hello as lexer or parser

使用 Pygments 检测代码片段的编程语言

用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框

编译器开发从零单排

如何在 JSON 中存储 javascript 函数