Antlr4与C#-在匹配符号之间解析文本

Antlr4与C#-在匹配符号之间解析文本,c#,visual-studio-2013,antlr4,C#,Visual Studio 2013,Antlr4,所以我被困住了,我试过的都没用。我试图解析匹配符号之间的文本,在本例中是等号。我在测试的另一个解析器中使用了它,但后来被删除了。我试图复制我能复制的,我的尝试如下面的代码所示 问题:我如何解析匹配符号之间的文本,和/或我当前的实现存在哪些错误 此外,还有一种方法可以获得找到的所有标记的输出——它们的名称和文本值。我还没有搜索这个,所以我相信我可以找到,但我一直被困在第一个问题上,所以我无法测试选项 所有这些都是在Antlr4、Visual Studio 2013和Windows 10上运行的 T

所以我被困住了,我试过的都没用。我试图解析匹配符号之间的文本,在本例中是等号。我在测试的另一个解析器中使用了它,但后来被删除了。我试图复制我能复制的,我的尝试如下面的代码所示

问题:我如何解析匹配符号之间的文本,和/或我当前的实现存在哪些错误

此外,还有一种方法可以获得找到的所有标记的输出——它们的名称和文本值。我还没有搜索这个,所以我相信我可以找到,但我一直被困在第一个问题上,所以我无法测试选项

所有这些都是在Antlr4、Visual Studio 2013和Windows 10上运行的

TestGrammar.g4:

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) 通常情况下,您会忽略空格而不是标记的一部分来编写语法,您可能也应该这样做。