Antlr4与C#-在匹配符号之间解析文本
所以我被困住了,我试过的都没用。我试图解析匹配符号之间的文本,在本例中是等号。我在测试的另一个解析器中使用了它,但后来被删除了。我试图复制我能复制的,我的尝试如下面的代码所示 问题:我如何解析匹配符号之间的文本,和/或我当前的实现存在哪些错误 此外,还有一种方法可以获得找到的所有标记的输出——它们的名称和文本值。我还没有搜索这个,所以我相信我可以找到,但我一直被困在第一个问题上,所以我无法测试选项 所有这些都是在Antlr4、Visual Studio 2013和Windows 10上运行的 TestGrammar.g4:Antlr4与C#-在匹配符号之间解析文本,c#,visual-studio-2013,antlr4,C#,Visual Studio 2013,Antlr4,所以我被困住了,我试过的都没用。我试图解析匹配符号之间的文本,在本例中是等号。我在测试的另一个解析器中使用了它,但后来被删除了。我试图复制我能复制的,我的尝试如下面的代码所示 问题:我如何解析匹配符号之间的文本,和/或我当前的实现存在哪些错误 此外,还有一种方法可以获得找到的所有标记的输出——它们的名称和文本值。我还没有搜索这个,所以我相信我可以找到,但我一直被困在第一个问题上,所以我无法测试选项 所有这些都是在Antlr4、Visual Studio 2013和Windows 10上运行的 T
grammar TestGrammar;
start
: title EOF
;
title
: EQUALS title EQUALS
| EQUALS ANY EQUALS // using NOTEQUALS didn't work either
| EQUALS ' ' ANY ' ' EQUALS
;
EQUALS: '=' ;
ANY : .+ ;
NOTEQUALS: ~[\r\n=]+ ;
Program.cs:
class Program
{
private static void Main(string[] args)
{
string[] testStrings =
{
"= asdf =",
"== asdf ==",
"=== asdf ===",
"=asdf=",
"==asdf==",
"===asdf==="
};
foreach (string s in testStrings)
{
AntlrInputStream inputStream = new AntlrInputStream(s);
TestGrammarLexer wikiLexer = new TestGrammarLexer(inputStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(wikiLexer);
TestGrammarParser wikiParser = new TestGrammarParser(commonTokenStream);
TestGrammarParser.StartContext startContext = wikiParser.start();
TestGrammarVisitor visitor = new TestGrammarVisitor();
visitor.VisitStart(startContext);
}
}
}
TestGrammarVisitor.cs
class TestGrammarVisitor : TestGrammarBaseVisitor<object>
{
public override object VisitStart([NotNull] TestGrammarParser.StartContext context)
{
Console.WriteLine("TestGrammarVisitor VisitStart");
context.children.OfType<TerminalNodeImpl>().ToList().ForEach(child => Visit(child));
return null;
}
private void Visit(TerminalNodeImpl node)
{
Console.WriteLine(" Visit Symbol='{0}'", node.Symbol.Text);
Console.WriteLine();
}
}
类TestGrammarVisitor:TestGrammarBaseVisitor
{
公共重写对象VisitStart([NotNull]TestGrammarParser.StartContext上下文)
{
Console.WriteLine(“TestGrammarVisitor访问启动”);
context.children.OfType().ToList().ForEach(child=>Visit(child));
返回null;
}
私有无效访问(TerminalNodeImpl节点)
{
WriteLine(“Visit Symbol='{0}',node.Symbol.Text);
Console.WriteLine();
}
}
结果:
line 1:0 no viable alternative at input '=== asdf ==='
TestGrammarVisitor VisitStart
Visit Symbol='<EOF>'
第1:0行输入“==asdf===”处没有可行的替代方案
TestGrammarVisitor访问启动
访问符号=“”
它对test1和test2是否正常工作?否。每个测试都以相同的结果失败。如果删除=和字符串之间的空格,是否有效?没有。我在没有空间的情况下尝试了所有三个测试用例。我还在标题中添加了一个考虑空格的条件,但仍然失败了。一些观察结果:1)你只匹配了一个等号,但你的测试用例有更多。2) 您的ANY
规则过于宽松,它匹配任何内容(包括等号!)。3) 通常情况下,您会忽略不属于标记的空格来编写语法,您可能也应该这样做。它对test1和test2是否正常工作?不,它没有。每个测试都以相同的结果失败。如果删除=和字符串之间的空格,是否有效?没有。我在没有空间的情况下尝试了所有三个测试用例。我还在标题中添加了一个考虑空格的条件,但仍然失败了。一些观察结果:1)你只匹配了一个等号,但你的测试用例有更多。2) 您的ANY
规则过于宽松,它匹配任何内容(包括等号!)。3) 通常情况下,您会忽略空格而不是标记的一部分来编写语法,您可能也应该这样做。