📄 parsetreebuilder.cs
字号:
using System;
using System.Collections;
using Antlr.Runtime;
using Antlr.Runtime.Debug;
using Antlr.Runtime.Tree;
namespace Antlr.Runtime.Debug
{
/// <summary>This parser listener tracks rule entry/exit and token
/// matches to build a simple parse tree using ParseTree nodes.</summary>
/// <remarks>This class will be added to ANTLR probably in 3.0b6.</remarks>
public class ParseTreeBuilder: BlankDebugEventListener
{
Stack callStack = new Stack();
public ParseTreeBuilder(String grammarName)
{
ParseTree root = Create("<grammar "+grammarName+">");
callStack.Push(root);
}
public ParseTree GetTree()
{
IEnumerator enumerator = callStack.GetEnumerator();
enumerator.MoveNext();
return (ParseTree)enumerator.Current;
}
/// <summary>What kind of node to create. You might want to override so I factored out creation here.</summary>
/// <param name="payload"></param>
/// <returns></returns>
public ParseTree Create(Object payload)
{
return new ParseTree(payload);
}
public override void EnterRule(String ruleName)
{
ParseTree parentRuleNode = (ParseTree)callStack.Peek();
ParseTree ruleNode = Create(ruleName);
parentRuleNode.AddChild(ruleNode);
callStack.Push(ruleNode);
}
public override void ExitRule(String ruleName)
{
callStack.Pop();
}
public override void ConsumeToken(IToken token)
{
ParseTree ruleNode = (ParseTree)callStack.Peek();
ParseTree elementNode = Create(token);
ruleNode.AddChild(elementNode);
}
public override void RecognitionException(RecognitionException e)
{
ParseTree ruleNode = (ParseTree)callStack.Peek();
ParseTree errorNode = Create(e);
ruleNode.AddChild(errorNode);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -