Antlr4 C#应用程序教程/示例

Nei*_*man 16 c# antlr antlr4

我想使用Antlr4来解析我的C#应用​​程序中的一些文件.鉴于我的语法,到目前为止,我已经能够生成解析器和词法分析器文件.现在我想在文件中使用read并将解析器和词法分析器应用于它们.我一直在寻找有关如何做到这一点的文档,但我很简短.我找到了一些使用以前版本的Antlr的旧例子,但它们似乎不适用于Antlr4.任何帮助,将不胜感激.谢谢.

Est*_*ten 27

  • 在Visual Studio中,转到工具 - >扩展和更新,然后在在线部分搜索Sam Harwell的"ANTLR语言支持".可以在GitHub项目站点上找到更多信息
    • 这做了几件事:
      • 为组合语法添加模板.
      • 添加语法突出显示
      • 为语法添加MSBuild目标以生成解析器.
  • 在您的解决方案中,设置您的项目结构如下:
      • GrammarProject
        • Calculator.g4
      • ImplementationProject
        • GeneratedFiles(此文件夹中的所有文件都作为链接添加到位于GrammarProject\obj\Debug中的文件)
          • CalculatorBaseListener.cs
          • CalculatorBaseVisitor.cs
          • CalculatorLexer.cs
          • CalculatorListener.cs
          • CalculatorParser.cs
          • CalculatorVistor.cs
        • MyCalcualtorImplementation.cs
  • 编写并编译你的语法.
  • 在"生成文件的链接"文件夹中,右键单击该文件夹,然后单击"添加" - >"现有项"
  • 浏览到Grammar Project\obj\Debug并选择所有生成的解析器文件.
  • 下一步很重要.在添加按钮上有一个小的下拉箭头.单击下拉箭头,然后单击"添加为链接".
    • 这将使用符号链接而不是直接副本将生成的文件添加到实现项目中.
    • 如果您以后必须更改语法,这将带来额外的好处,即不必删除和重新添加解析器文件.
  • 到目前为止,您可以继承GrammarProject.CalculatorBaseListener或GrammarProject.CalculatorBaseParser,具体取决于您决定使用的开发模式.

作为旁注,Terence Parr的"最终的ANTLR 4参考"是了解ANTLR4如何工作以及不同发展模式的优秀资源.所有示例都在java中,但这些概念同时适用于Java和C#.


Nar*_*kha 11

尝试

using (StreamReader fileStream = new StreamReader(fileName)) {
    AntlrInputStream inputStream = new AntlrInputStream(fileStream);

    SearchLexer lexer = new SearchLexer(inputStream);
    CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
    SearchParser parser = new SearchParser(commonTokenStream);

    parser.RemoveErrorListeners();
    parser.AddErrorListener(new ErrorListener()); // add ours

    parser.root();
}
Run Code Online (Sandbox Code Playgroud)


Seb*_*idz 5

我使用的是 Visual Studio 2019 Professional(最新版​​本 16.7.3)

目前VS 2019 不支持ANTLR 语言支持。有一个非官方版本可用https://github.com/tunnelvisionlabs/antlr4cs/issues/353,但它不兼容 VS2019 扩展 API(更多信息请参见:https://github.com/tunnelvisionlabs/antlr4cs/issues/353) /devblogs.microsoft.com/visualstudio/updates-to-synchronous-autoload-of-extensions-in-visual-studio-2019/

您可以尝试以下操作(.net 标准库的步骤)

  1. 安装 VS 扩展 AntlrVSIX 8.0(使用扩展管理器)

  2. 创建 .NET 标准库项目 (MyLib.Parser.Grammar)

  3. 创建了一个虚拟(.cs)类 - 不确定是否仍然有必要,如果项目仅包含语法文件,过去会出现一些问题

  4. 参考以下包(使用Nuget)

    • Antlr4.运行时.标准
    • Antlr4Build任务
  5. 添加语法文件(.g4),例如您可以使用此处提供的语法存储库 https://github.com/antlr/grammars-v4

  6. 假设您想解析 TSQL ( https://github.com/antlr/grammars-v4/tree/master/sql/tsql ) - 将 TSqlParser.g4 和 TSqllexer.g4 添加到您的项目中

  7. 编辑项目文件 MyLib.Parser.Grammar.csproj,它应该类似于

       <PropertyGroup>
         <TargetFramework>netstandard2.1</TargetFramework>
       </PropertyGroup>   
    
       <ItemGroup>
         <Antlr4 Include="TSqlLexer.g4">
           <Package>MyLib.Parser</Package>
           <Visitor>true</Visitor>
           <Error>false</Error>
           <Listener>true</Listener>      
         </Antlr4>
         <Antlr4 Include="TSqlParser.g4">
           <Package>MyLib.Parser</Package>
           <Visitor>true</Visitor>
           <Error>false</Error>
           <Listener>true</Listener>      
         </Antlr4>
       </ItemGroup>
    
       <ItemGroup>
         <PackageReference Include="Antlr4.Runtime.Standard" Version="4.8.0" />
         <PackageReference Include="Antlr4BuildTasks" Version="8.3.0" />
       </ItemGroup>
    
     </Project>
    
    Run Code Online (Sandbox Code Playgroud)
  8. 此时,当您构建 MyLib.Parser.Grammar 项目时,Antlr4BuildTasks 工具将创建解析器 .cs 文件,但它们将在项目bin文件夹中可用(例如\MyLib.Parser.Grammar\bin\Debug\netstandard2.1

  9. 创建另一个库项目 MyLib.Parser

  10. 创建项目依赖项,以便 MyLib.Parser.Grammar 在 MyLib.Parser 之前构建

  11. 使用 AntOutDir 属性和项目定义中的相对路径将输出文件从 MyLib.Parser.Grammar 定向到 MyLib.Parser 项目。现在项目文件中的 Antlr4 部分应该类似于:

<ItemGroup>    
<Antlr4 Include="TSqlLexer.g4">
  <Package>MyLib.Parser</Package>
  <Visitor>true</Visitor>
  <Error>false</Error>
  <Listener>true</Listener>
  <AntOutDir>..\MyLib.Parser</AntOutDir>
</Antlr4>
<Antlr4 Include="TSqlParser.g4">
  <Package>MyLib.Parser</Package>
  <Visitor>true</Visitor>
  <Error>false</Error>
  <Listener>true</Listener>
  <AntOutDir>..\MyLib.Parser</AntOutDir>
</Antlr4>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
  1. 现在重建后,生成的 .cs 文件应该自动添加到 MyLib.Parser 项目中