我想使用Antlr4来解析我的C#应用程序中的一些文件。鉴于我的语法,到目前为止,我已经能够生成解析器和词法分析器文件。现在我想在文件中使用read并将解析器和词法分析器应用于它们。我一直在寻找有关如何做到这一点的文档,但我很简短。我找到了一些使用以前版本的Antlr的旧例子,但它们似乎不适用于Antlr4。任何帮助,将不胜感激。感谢。
答案 0 :(得分:26)
作为旁注,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标准库的步骤)
安装VS扩展AntlrVSIX 8.0(使用扩展管理器)
创建一个.NET标准库项目(MyLib.Parser.Grammar)
创建了一个虚拟(.cs)类-不确定是否仍然需要该类,如果项目仅包含语法文件,则在过去会出现一些问题
参考以下软件包(使用Nuget)
添加语法文件(.g4),例如您可以使用此处可用的语法存储库 https://github.com/antlr/grammars-v4
假设您要解析TSQL(https://github.com/antlr/grammars-v4/tree/master/sql/tsql)-将TSqlParser.g4和TSqllexer.g4添加到您的项目中
编辑项目文件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>
此时,当您构建MyLib.Parser.Grammar项目时,Antlr4BuildTasks工具将创建解析器.cs文件,但它们将在项目bin
文件夹中可用(例如{{1} })
创建另一个库项目MyLib.Parser
创建项目依赖项,以便在MyLib.Parser之前构建MyLib.Parser.Grammar
使用项目定义中的AntOutDir属性和相对路径将输出文件从MyLib.Parser.Grammar定向到MyLib.Parser项目。现在,项目文件中的Antlr4部分应该类似于:
\MyLib.Parser.Grammar\bin\Debug\netstandard2.1