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

时间:2015-08-06 12:44:44

标签: c# antlr4 antlr4cs

g4文件:

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*/中获得了单个字符串。没有发现单行注释。

怎么了?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

compileUnit : ( LC | BC ) EOF ;

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

compileUnit : ( LC | BC )+ EOF ;