ANTLR:获取语法树的最快方法是什么?

时间:2011-04-08 13:51:23

标签: c# antlr

获取语法树的最快(较小代码)方式是什么?

我正在尝试获取语法树。我根据我的简单语法生成了C#代码:

grammar MyPascal;
options
{
    language=CSharp3;
    output=AST;
}

operator: (block | ID);
block   : BEGIN operator* END;
BEGIN   :'begin';
END     :'end';
ID      :('a'..'z')+;
WS      :( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;};

当我使用ANTLR时,它适用于简单的输入文本,如:

input.txt:
begin
  abs
  qwe
  begin
    begin
    end
  end
end

我得到了很好的语法树图片。

现在我想知道是否有任何简单的方法可以从C#获取我的“程序”的树结构,而无需编写1000行代码。

这里我试图获得语法树:

class Program
{
    static void Main(string[] args)
    {
        MyPascalLexer lex = new MyPascalLexer(new ANTLRFileStream(@"M:\input.txt"));
        CommonTokenStream tokens = new CommonTokenStream(lex);
        MyPascalParser g = new MyMyPascalParser(tokens);
        MyPascalParser.myprogram_return X = g.myprogram();                                       
        Console.WriteLine(X.Tree);  // Writes: nill
        Console.WriteLine(X.Start); // Writes: [@0,0:4='begin',<4>,1:0]
        Console.WriteLine(X.Stop);  // Writes: [@35,57:57='end',<19>,12:2]
    }
}

1 个答案:

答案 0 :(得分:1)

你必须“告诉”ANTLR建立一个AST,而不是只是一个平坦的标记流(简单的解析树)。

请参阅this SO Q&A,了解如何在C#中执行此操作。

另外,你不应该使用:

ID : ('a'..'z')*;

即:让lexer规则匹配一个空字符串,这可能(甚至会?)让你遇到麻烦(它总是匹配!)。你想让它至少匹配一个字符:

ID : ('a'..'z')+;