我有更多'在我的词法分析器语法中的一个规则中命令。因此,单个字符标记匹配多个字符文本,这不能发生或我遗漏了一些东西。这是语法:
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中的错误。
答案 0 :(得分:1)
more
命令会将匹配的内容添加到实际生成的下一个令牌的内容中。对于输入"x"
,点匹配并消耗输入中的x
; Text
规则没有其他输入可以有效匹配,因此没有Text
令牌。
点匹配后的第一个标记是结束引号标记,最后是内容x"
。
more
命令的约束,以将内容累积到最终生成的令牌中。