Mercurial > hg > Members > kono > PLparser
diff src/plparser/PropertyListScope.java @ 1:b149a5aa465a
Parser is written
author | kono@ie.u-ryukyu.ac.jp |
---|---|
date | Sat, 28 Aug 2010 17:39:34 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plparser/PropertyListScope.java Sat Aug 28 17:39:34 2010 +0900 @@ -0,0 +1,50 @@ +package plparser; + +import java.util.TreeMap; + +/* + * Scope mechanism for local variable + * define("<>(x)","~(true& ~x)"); + * previous x token is stored in an association list + * pop() remove local x token and restore previous x. + * previous x may be null. We cannot use this scope + * for quantifiers since our macro evaluator already + * convert everything in symbols. + */ +public class PropertyListScope<Node> { + public TreeMap<String,Token<Node>> scope; + public Dictionary<Node> dict; + public PropertyListScope<Node> prev; + + + public PropertyListScope(PropertyListScope<Node>prev, Dictionary<Node> dict) { + this.dict = dict; + this.prev = prev; + this.scope = new TreeMap<String,Token<Node>>(); + } + + + // enter the scope + public PropertyListScope<Node> push() { + return new PropertyListScope<Node>(this,dict); + } + + // exit the scope + public PropertyListScope<Node> pop() { + // restore local variable name + for(String name: scope.keySet()) { + Token<Node> t = scope.get(name); + dict.put(name, t); // overwrite + } + return prev; + } + + // make new local name in this scope + public Token<Node> getLocalName(String name) { + Token<Node> n = new Token<Node>(name); + Token<Node> t=dict.get(name); + scope.put(name, t); // remember original + dict.put(name,n); // overwrite entry with new one + return n; + } +} \ No newline at end of file