如何在 .NET 中 使用 ANTLR4

> ReadCsv(string tableName)

{
    var csvFile = new FileInfo(Path.Combine(csvDirectory.FullName, $"{tableName}.csv"));
    if (!csvFile.Exists)
    {
        throw new FileNotFoundException($"CSV file {csvFile.FullName} does not exist.");
    }

using var reader = new StreamReader(csvFile.FullName);

    var headerLine = reader.ReadLine();
    if (headerLine == null)
    {
        throw new InvalidOperationException($"CSV file {csvFile.FullName} is empty.");
    }

var headers = headerLine.Split(‘,’);

    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        if (line == null) continue;
        var values = line.Split(',');
        yield return headers.Zip(values).ToDictionary(x => x.First, x => x.Second);
    }
}

}

接下来我们就可以开始测试了:
测试用的 CSV 文件内容如下:
```csv
Name,City,Occupation,Company
Alice,New York,Engineer,TechCorp
Bob,Los Angeles,Designer,Creative Inc
Ben,Atlanta,Writer,Publishing House
Charlie,Chicago,Manager,Finance Group
David,Houston,Teacher,School District
Eve,Miami,Student,University
Frank,Seattle,Chef,Restaurant Co
Grace,San Francisco,Doctor,HealthCare
Hannah,Boston,Lawyer,Legal Partners
Ian,Denver,Architect,BuildIt
var directory = new DirectoryInfo("/Users/hkh/Desktop/test");
var engine = new SqlToCsvEngine(directory);
var sql =
  """
  SELECT Name, City, Occupation, Company
  FROM Employee
  WHERE City != 'Miami'
    AND Occupation LIKE '%er'
  ORDER BY Name ASC, Company DESC
  """;
var result = engine.ExecuteQuery(sql);
// 打印头部
foreach (var column in result.First().Keys)
{
    Console.Write($"{column}\t");
}
foreach (var row in result)
{
    Console.WriteLine();
    foreach (var (_, value) in row)
    {
        Console.Write($"{value}\t");
    }
}

输出结果如下:

Name    City    Occupation      Company 
Alice   New York        Engineer        TechCorp        
Ben     Atlanta Writer  Publishing House        
Bob     Los Angeles     Designer        Creative Inc    
Charlie Chicago Manager Finance Group   
David   Houston Teacher School District 
Hannah  Boston  Lawyer  Legal Partners  

参考资料

https://github.com/antlr/grammars-v4 https://wizardforcel.gitbooks.io/antlr4-short-course/content/basic-concept.html https://github.com/antlr/antlr4/blob/master/doc/csharp-target.md ANTLR4 权威指南 极客时间 编译原理之美