带有C#的Antlr4 - 在匹配的符号之间解析文本

时间:2015-08-16 08:10:33

标签: c# visual-studio-2013 antlr4

所以我被卡住了,我所尝试的一切都没有奏效。我试图在匹配的符号之间解析文本,在这种情况下,等号。我已经让它在我正在测试的不同解析器中工作,但后来被删除了。我试图复制我能做的事情,我的尝试显示在下面的代码中。

  

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

此外,除此之外,还有一种方法可以获得所有找到的标记的输出 - 它们的名称和文本值。我还没有找到这个,所以我确定我能找到答案,但我一直坚持这个第一个问题所以我还没有能够测试选项。

所有这些都与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();
    }
}

结果:

line 1:0 no viable alternative at input '=== asdf ==='
TestGrammarVisitor VisitStart
 Visit Symbol='<EOF>'

0 个答案:

没有答案