001/* 002 * Copyright (C) 2009-2011 Mathias Doenitz 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.parboiled.support; 018 019import org.parboiled.common.ConsoleSink; 020import org.parboiled.common.Sink; 021import org.parboiled.common.StringUtils; 022 023import java.util.LinkedList; 024 025public class DebuggingValueStack<V> extends DefaultValueStack<V> { 026 public final Sink<String> log; 027 028 public DebuggingValueStack() { 029 this(new ConsoleSink()); 030 } 031 032 public DebuggingValueStack(Sink<String> log) { 033 this.log = log; 034 } 035 036 public DebuggingValueStack(Iterable<V> values) { 037 this(values, new ConsoleSink()); 038 } 039 040 public DebuggingValueStack(Iterable<V> values, Sink<String> log) { 041 super(values); 042 this.log = log; 043 } 044 045 @Override 046 public void clear() { 047 if (head != null) { 048 super.clear(); 049 log("clear"); 050 } 051 } 052 053 @Override 054 public void restoreSnapshot(Object snapshot) { 055 if (head == null && snapshot == null || head != null && head.equals(snapshot)) return; 056 super.restoreSnapshot(snapshot); 057 log("restoreSnapshot"); 058 } 059 060 @Override 061 public void push(V value) { 062 super.push(value); 063 log("push"); 064 } 065 066 @Override 067 public void push(int down, V value) { 068 super.push(down, value); 069 log("push"); 070 } 071 072 @Override 073 public V pop(int down) { 074 V v = super.pop(down); 075 log("pop"); 076 return v; 077 } 078 079 @Override 080 public void poke(int down, V value) { 081 super.poke(down, value); 082 log("poke"); 083 } 084 085 @Override 086 public void swap() { 087 super.swap(); 088 log("swap"); 089 } 090 091 @Override 092 public void swap3() { 093 super.swap3(); 094 log("swap3"); 095 } 096 097 @Override 098 public void swap4() { 099 super.swap4(); 100 log("swap4"); 101 } 102 103 @Override 104 public void swap5() { 105 super.swap5(); 106 log("swap5"); 107 } 108 109 @Override 110 public void swap6() { 111 super.swap6(); 112 log("swap6"); 113 } 114 115 protected void log(String action) { 116 log.receive(action); 117 log.receive(StringUtils.repeat(' ', 15 - action.length())); 118 log.receive(": "); 119 LinkedList<V> elements = new LinkedList<V>(); 120 for (V v : this) elements.addFirst(v); 121 log.receive(StringUtils.join(elements, ", ")); 122 log.receive("\n"); 123 } 124}