parsetreebuilder.cs

来自「antlr小例子 。」· CS 代码 · 共 64 行

CS
64
字号
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 + =
减小字号Ctrl + -
显示快捷键?