获取语法树的最快(较小代码)方式是什么?
我正在尝试获取语法树。我根据我的简单语法生成了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]
}
}
答案 0 :(得分:1)
你必须“告诉”ANTLR建立一个AST,而不是只是一个平坦的标记流(简单的解析树)。
请参阅this SO Q&A,了解如何在C#中执行此操作。
另外,你不应该使用:
ID : ('a'..'z')*;
即:让lexer规则匹配一个空字符串,这可能(甚至会?)让你遇到麻烦(它总是匹配!)。你想让它至少匹配一个字符:
ID : ('a'..'z')+;