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

时间:2013-10-11 21:52:53

标签: c# antlr antlr4

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

4 个答案:

答案 0 :(得分:26)

  • 在Visual Studio中,转到工具 - >扩展和更新,并在线部分搜索Sam Harwell的“ANTLR语言支持”。更多信息可以在GitHub project site找到
    • 这样做有以下几点:
      • 为组合语法添加模板。
      • 添加语法突出显示
      • 为语法添加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的"The Definitive ANTLR 4 Reference"是了解ANTLR4如何工作以及不同发展模式的绝佳资源。所有示例都在java中,但这些概念同时适用于Java和C#。

答案 1 :(得分:10)

尝试

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();
}

答案 2 :(得分:1)

这是一个ErrorListener

的示例
public class ErrorListener : BaseErrorListener
{
    public void SyntaxError(IRecognizer recognizer, int offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        Console.WriteLine("{0}: line {1}/column {2} {3}", e, line, charPositionInLine, msg);
    }
}

答案 3 :(得分:0)

我正在使用Visual Studio 2019 Professional(最新版​​本16.7.3)

目前, ANTLR语言支持不适用于VS2019。有一个非官方的版本https://github.com/tunnelvisionlabs/antlr4cs/issues/353,但VS2019扩展API对此没有抱怨。 (更多信息在这里:https://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.Runtime.Standard
    • Antlr4BuildTasks
  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>
    
  8. 此时,当您构建MyLib.Parser.Grammar项目时,Antlr4BuildTasks工具将创建解析器.cs文件,但它们将在项目bin文件夹中可用(例如{{1} })

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

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

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

\MyLib.Parser.Grammar\bin\Debug\netstandard2.1
  1. 现在,重建后,应将生成的.cs文件自动添加到MyLib.Parser项目中