调用'更多'之后Antlr4词法分析器的意外行为命令

时间:2015-10-10 16:00:42

标签: antlr antlr4 lexer

我有更多'在我的词法分析器语法中的一个规则中命令。因此,单个字符标记匹配多个字符文本,这不能发生或我遗漏了一些东西。这是语法:

lexer grammar MyLexer; StartQuote : '"' -> pushMode(BeforeTextMode) ; mode BeforeTextMode; SwitchToTextMode : . -> more, mode(TextMode) ; mode TextMode; Text : ~'"'+ ; EndQuote : '"' -> popMode ;

以下是测试程序:

class Program
{
    static string InputText1 = "\"x\"";
    static string InputText2 = "\"xy\"";

    static string[] TokenTypeNames = new string[] { "StartQuote", "Text", "EndQuote" };

    static void Main(string[] args)
    {
        string TokenSequence1 = GetTokenSequence(InputText1);
        string TokenSequence2 = GetTokenSequence(InputText2);

        Console.WriteLine(TokenSequence1);
        Console.WriteLine(TokenSequence2);
    }

    static string GetTokenSequence(string InputText)
    {
        var Lexer = new MyLexer(new AntlrInputStream(InputText));
        string TokenSequence = "";
        for (var Token = Lexer.NextToken(); Token.Type != -1; Token = Lexer.NextToken())
            TokenSequence += TokenTypeNames[Token.Type - 1] + "(" + Token.Text + ")" + " ";
        return TokenSequence;
    }
}

输出:

StartQuote(") EndQuote(x")
StartQuote(") Text(xy) EndQuote(")

从程序的输出中可以看出,单个字符EndQuote匹配多个字符文本。仅当输入文本在引号之间包含单个字符时才会发生这种情况。

请你看看我是否遗漏了任何东西,如果这确实是Antlr4中的错误。

1 个答案:

答案 0 :(得分:1)

more命令会将匹配的内容添加到实际生成的下一个令牌的内容中。对于输入"x",点匹配并消耗输入中的x; Text规则没有其他输入可以有效匹配,因此没有Text令牌。

点匹配后的第一个标记是结束引号标记,最后是内容x"

BTW,此行为允许连续的规则匹配受more命令的约束,以将内容累积到最终生成的令牌中。