c#中的ANTLR4只捕获一个令牌

本文关键字:一个 令牌 中的 ANTLR4 | 更新日期: 2023-09-27 18:06:52

g4 file:

grammar TestFlow;
options
{
    language=CSharp4;
    output=AST;
}
/*
 * Parser Rules
 */
compileUnit : LC | BC ;
/*
 * Lexer Rules
 */
BC  : '/*' .*? '*/' ;
LC  : '//' .*? ['r'n] ;
代码:

var input = "   /*aaa*/   ///   'n   ";
var stream = new AntlrInputStream(input);
ITokenSource lexer = new TestFlowLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
var parser = new TestFlowParser(tokens);
parser.BuildParseTree = true;
var tree = parser.compileUnit();
var n = tree.ChildCount;
var top = new List<string>();
for (int i = 0; i < n; i++) {
    top.Add(tree.GetChild(i).GetText());
}

运行以上代码后,我在top: /*aaa*/中得到单个字符串。单行注释不会被捕获。

怎么了?

c#中的ANTLR4只捕获一个令牌

所有解析器/词法分析器生成错误&警告是重要的。options语句在当前版本的Antlr4中无效。

运行时错误详细说明了根本问题:无法识别的输入字符,特别是语法不处理空白。添加一个词法分析器规则来修复:

WS: [ 'r'n't] -> skip ;

虽然不一定是问题,但要求解析器处理所有输入是很好的形式。词法分析器将在源输入的末尾生成一个EOF令牌。修复主规则要求EOF:

compileUnit : ( LC | BC ) EOF ;

允许重复的正确方法是使用*+操作符:

compileUnit : ( LC | BC )+ EOF ;