diff --git a/src/compile/Grouping.java b/src/compile/Grouping.java index 1eec445e..5f181795 100644 --- a/src/compile/Grouping.java +++ b/src/compile/Grouping.java @@ -86,7 +86,7 @@ private void createGroup(List insts) { if (inst.getKind() == Instruction.COMMIT || inst.getKind() == Instruction.JUMP) break; Integer group = null; Integer changegroup = null; - ArrayList list = inst.getVarArgs(new HashMap()); + ArrayList list = inst.getVarArgs(new HashMap<>()); if (list.isEmpty()) continue; for (int j = 0; j < list.size(); j++) { if (list.get(j).equals(0)) continue; diff --git a/src/compile/GuardCompiler.java b/src/compile/GuardCompiler.java index fff74724..bac16cc4 100644 --- a/src/compile/GuardCompiler.java +++ b/src/compile/GuardCompiler.java @@ -781,10 +781,11 @@ else if (true) { hlgroundAttrs.put(def1, attrAtoms); // System.out.println("#hlgroundAttrs: " + hlgroundAttrs.get(def1).length); checktypedefLink(func, def1); - } else { - error("COMPILE ERROR: unrecognized type constraint: " + cstr); - discardTypeConstraint(cstr); // ここには来ない } + // else { + // error("COMPILE ERROR: unrecognized type constraint: " + cstr); + // discardTypeConstraint(cstr); // ここには来ない + // } lit.remove(); changed = true; } diff --git a/src/compile/RuleCompiler.java b/src/compile/RuleCompiler.java index 059a4594..6d921317 100644 --- a/src/compile/RuleCompiler.java +++ b/src/compile/RuleCompiler.java @@ -713,7 +713,7 @@ private void fixUniqOrder() { /** 否定条件をコンパイルする */ void compileNegatives() { - Iterator> it = rs.guardNegatives.iterator(); + Iterator> it = rs.guardNegatives.iterator(); while (it.hasNext()) { List eqs = it.next(); HeadCompiler negcmp = hc.getNormalizedHeadCompiler(); diff --git a/src/compile/parser/LMNParser.java b/src/compile/parser/LMNParser.java index 0612ab1c..2e97518f 100644 --- a/src/compile/parser/LMNParser.java +++ b/src/compile/parser/LMNParser.java @@ -16,12 +16,13 @@ import compile.structure.RuleStructure; import compile.structure.TypeDefStructure; import java.io.Reader; +import java.util.AbstractMap; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; -import java.util.List; import java.util.ListIterator; +import java.util.Map; import java_cup.runtime.Scanner; import runtime.Env; import runtime.functor.Functor; @@ -95,7 +96,7 @@ public Membrane parse() throws ParseException { expander.correctWorld(initRule.body); // addProcessToMem(srcProcess, mem); addObjectToMem(initRule, mem); - HashMap freeLinks = addProxies(mem); + HashMap freeLinks = addProxies(mem); if (!freeLinks.isEmpty()) closeFreeLinks(mem); return mem; } @@ -113,7 +114,7 @@ protected SrcRule parseSrc() throws ParseException { result = (SrcRule) p.parse().value; } catch (Error e) { error("ERROR: " + e.getMessage()); - result = new SrcRule("ERROR", new LinkedList(), new LinkedList()); + result = new SrcRule("ERROR", new LinkedList<>(), new LinkedList<>()); } catch (Throwable e) { throw new ParseException(e.getMessage(), e); } @@ -129,14 +130,14 @@ private void setRuleText(SrcRule rule) { } /** ルールのテキスト表現を決定する */ - private void setRuleText(LinkedList process) { - for (Object obj : process) { + private void setRuleText(LinkedList process) { + for (SrcElement obj : process) { if (obj instanceof SrcAtom) { setRuleText(((SrcAtom) obj).getProcess()); } else if (obj instanceof SrcMembrane) { setRuleText(((SrcMembrane) obj).getProcess()); - } else if (obj instanceof LinkedList) { - setRuleText((LinkedList) obj); + } else if (obj instanceof SrcList) { + setRuleText(((SrcList) obj).list); } else if (obj instanceof SrcRule) { SrcRule rule = (SrcRule) obj; rule.setText(); @@ -182,8 +183,8 @@ private void setLinkToAtomArg(SrcLink link, Atomic atom, int pos) { * @param list 登録する構文オブジェクトのリスト * @param mem 追加先の膜 */ - void addProcessToMem(LinkedList list, Membrane mem) throws ParseException { - for (Object obj : list) { + void addProcessToMem(LinkedList list, Membrane mem) throws ParseException { + for (SrcElement obj : list) { addObjectToMem(obj, mem); } } @@ -193,10 +194,10 @@ void addProcessToMem(LinkedList list, Membrane mem) throws ParseException { * @param obj 追加する構文オブジェクト * @param mem 追加先の膜 */ - private void addObjectToMem(Object obj, Membrane mem) throws ParseException { + private void addObjectToMem(SrcElement obj, Membrane mem) throws ParseException { // リスト - if (obj instanceof LinkedList) { - for (Object elem : (LinkedList) obj) { + if (obj instanceof SrcList) { + for (SrcElement elem : ((SrcList) obj).list) { addObjectToMem(elem, mem); } } @@ -269,7 +270,7 @@ private void addSrcMemToMem(SrcMembrane sMem, Membrane mem) throws ParseExceptio private void addSrcAtomToMem(SrcAtom sAtom, Membrane mem) { boolean alllinks = true; boolean allbundles = true; - LinkedList p = sAtom.getProcess(); + LinkedList p = sAtom.getProcess(); int arity = p.size(); // [1] ファンクタを生成する @@ -353,10 +354,10 @@ private void addSrcProcessContextToMem(SrcProcessContext sProc, Membrane mem) { /*seiji--*/ pc.linkName = sProc.getLinkName(); if (sProc.hasSameNameList()) { - if (pc.getSameNameList() == null) pc.sameNameList = new LinkedList(); + if (pc.getSameNameList() == null) pc.sameNameList = new LinkedList<>(); for (int i = 0; i < sProc.getSameNameList().size(); i++) - pc.getSameNameList().add((String) sProc.getSameNameList().get(i)); - ListIterator itt = pc.sameNameList.listIterator(); + pc.getSameNameList().add(sProc.getSameNameList().get(i)); + // ListIterator itt = pc.sameNameList.listIterator(); } } /*--seiji*/ } @@ -390,7 +391,7 @@ private void addSrcRuleToMem(SrcRule sRule, Membrane mem) throws ParseException // 左辺およびガード型制約に対して、構造を生成し、リンク以外の名前を解決する addProcessToMem(sRule.getHead(), rule.leftMem); addProcessToMem(sRule.getGuard(), rule.guardMem); - HashMap names = resolveHeadContextNames(rule); + HashMap names = resolveHeadContextNames(rule); // ガード否定条件および右辺に対して、構造を生成し、リンク以外の名前を解決する addGuardNegatives(sRule.getGuardNegatives(), rule, names); addProcessToMem(sRule.getBody(), rule.rightMem); @@ -431,9 +432,9 @@ private void addSrcTypeDefToMem(SrcTypeDef sTypeDef, Membrane mem) throws ParseE rule.setText(); addSrcRuleToMem(rule, typeDef.mem); } else if (obj instanceof SrcAtom) { - LinkedList atoms = new LinkedList<>(); + LinkedList atoms = new LinkedList<>(); atoms.add(sTypeDef.typeName.clone()); - atoms.add(obj); + atoms.add((SrcAtom) obj); SrcRule rule = new SrcRule("", atoms, new LinkedList<>()); rule.setText(); addSrcRuleToMem(rule, typeDef.mem); @@ -447,7 +448,7 @@ private void addSrcTypeDefToMem(SrcTypeDef sTypeDef, Membrane mem) throws ParseE * アトム展開されたソース膜に対してルールが無いことを確認する * */ - private void assertLHSRules(List procs) throws ParseException { + private void assertLHSRules(LinkedList procs) throws ParseException { for (Object obj : procs) { if (obj instanceof SrcRule) { SrcRule sr = (SrcRule) obj; @@ -462,14 +463,17 @@ private void assertLHSRules(List procs) throws ParseException { * @param sNegatives ガード否定条件の中間形式[$p,[Q]]のリスト[in] * @param rule ルール構造[in,out] * @param names 左辺およびガード型制約に出現した$p(と*X)からその定義(と出現)へのマップ[in] */ - private void addGuardNegatives(LinkedList sNegatives, RuleStructure rule, HashMap names) + private void addGuardNegatives( + LinkedList>> sNegatives, + RuleStructure rule, + HashMap names) throws ParseException { - for (List list1 : sNegatives) { - List neg = new LinkedList<>(); - ListIterator it2 = list1.listIterator(); + for (LinkedList> list1 : sNegatives) { + LinkedList neg = new LinkedList<>(); + ListIterator> it2 = list1.listIterator(); while (it2.hasNext()) { - LinkedList sPair = (LinkedList) it2.next(); - String cxtname = ((SrcProcessContext) sPair.getFirst()).getQualifiedName(); + Map.Entry sPair = it2.next(); + String cxtname = sPair.getKey().getQualifiedName(); if (!names.containsKey(cxtname)) { error( "SYNTAX ERROR: fresh process context constrained in a negative condition: " @@ -477,7 +481,7 @@ private void addGuardNegatives(LinkedList sNegatives, RuleStructure rule, + " in a rule at line " + rule.lineno); } else { - ContextDef def = (ContextDef) names.get(cxtname); + ContextDef def = names.get(cxtname); if (def.typed) { error( "SYNTAX ERROR: typed process context constrained in a negative condition: " @@ -486,7 +490,7 @@ private void addGuardNegatives(LinkedList sNegatives, RuleStructure rule, + rule.lineno); } else if (def.lhsOcc != null) { Membrane mem = new Membrane(null); - addProcessToMem((LinkedList) sPair.getLast(), mem); + addObjectToMem(sPair.getValue(), mem); neg.add(new ProcessContextEquation(def, mem)); } } @@ -502,13 +506,13 @@ private void addGuardNegatives(LinkedList sNegatives, RuleStructure rule, /** 子膜に対して再帰的にプロキシを追加する。 * @return この膜の更新された自由リンクマップ mem.freeLinks */ - private HashMap addProxies(Membrane mem) { + private HashMap addProxies(Membrane mem) { HashSet proxyLinkNames = new HashSet<>(); // memとその子膜の間に作成した膜間リンク名の集合 for (Membrane submem : mem.mems) { - HashMap freeLinks = addProxies(submem); + HashMap freeLinks = addProxies(submem); // 子膜の自由リンクに対してプロキシを追加する - HashMap newFreeLinks = new HashMap(); - for (Object link : freeLinks.keySet()) { + HashMap newFreeLinks = new HashMap<>(); + for (String link : freeLinks.keySet()) { LinkOccurrence freeLink = (LinkOccurrence) freeLinks.get(link); // 子膜の自由リンク名 freeLink.name に対して、膜間リンク名 proxyLinkName を決定する。 // 通常はXに対して、1^Xとする。 @@ -555,10 +559,9 @@ private HashMap addProxies(Membrane mem) { /** ガード否定条件に対してaddProxiesを呼ぶ */ private void addProxiesToGuardNegatives(RuleStructure rule) { - for (Object guardNegative : rule.guardNegatives) { - for (Object pCtxEq : (LinkedList) guardNegative) { - ProcessContextEquation eq = (ProcessContextEquation) pCtxEq; - addProxies(eq.mem); + for (LinkedList guardNegative : rule.guardNegatives) { + for (ProcessContextEquation pCtxEq : guardNegative) { + addProxies(pCtxEq.mem); } } } @@ -569,31 +572,41 @@ private void addProxiesToGuardNegatives(RuleStructure rule) { *

副作用として、メソッドの戻り値を mem.freeLinks にセットする。 * @return リンク名から自由リンク出現へのHashMap */ - private HashMap coupleLinks(Membrane mem) { + private HashMap coupleLinks(Membrane mem) { // 同じ膜レベルのリンク結合を行う - HashMap links = new HashMap(); - List[] lists = {mem.atoms, mem.processContexts, mem.typedProcessContexts}; - for (int i = 0; i < lists.length; i++) { - Iterator it = lists[i].iterator(); - while (it.hasNext()) { - Atomic a = (Atomic) it.next(); - for (int j = 0; j < a.args.length; j++) { - if (a.args[j].buddy == null) { // outside_proxyの第1引数はすでに非nullになっている - addLinkOccurrence(links, a.args[j]); - } + HashMap links = new HashMap<>(); + for (Atom a : mem.atoms) { + for (int j = 0; j < a.args.length; j++) { + if (a.args[j].buddy == null) { // outside_proxyの第1引数はすでに非nullになっている + addLinkOccurrence(links, a.args[j]); + } + } + } + for (ProcessContext a : mem.processContexts) { + for (int j = 0; j < a.args.length; j++) { + if (a.args[j].buddy == null) { // outside_proxyの第1引数はすでに非nullになっている + addLinkOccurrence(links, a.args[j]); + } + } + } + for (ProcessContext a : mem.typedProcessContexts) { + for (int j = 0; j < a.args.length; j++) { + if (a.args[j].buddy == null) { // outside_proxyの第1引数はすでに非nullになっている + addLinkOccurrence(links, a.args[j]); } } } + removeClosedLinks(links); mem.freeLinks = links; return links; } /** 閉じたリンクをlinksから除去する */ - private static void removeClosedLinks(HashMap links) { - Iterator it = links.keySet().iterator(); + private static void removeClosedLinks(HashMap links) { + Iterator it = links.keySet().iterator(); while (it.hasNext()) { - String linkName = (String) it.next(); + String linkName = it.next(); if (links.get(linkName) == CLOSED_LINK) it.remove(); } } @@ -631,7 +644,7 @@ public void closeFreeLinks(Membrane mem) { while (it.hasNext()) { LinkOccurrence link = mem.freeLinks.get(it.next()); warning("WARNING: global singleton link: " + link.name + " at line " + link.atom.line); - LinkedList process = new LinkedList(); + LinkedList process = new LinkedList<>(); process.add(new SrcLink(link.name)); SrcAtom sAtom = new SrcAtom(link.name, process); addSrcAtomToMem(sAtom, mem); @@ -651,16 +664,18 @@ public void closeFreeLinks(Membrane mem) { * *

ガードコンパイルで実際に使うときには、等式間リンクに対して、自由リンク管理アトムの鎖を適宜補うこと。*/ void coupleGuardNegativeLinks(RuleStructure rule) { - for (Object obj1 : rule.guardNegatives) { - HashMap interlinks = new HashMap(); // 等式間リンクおよびガード匿名リンクの一覧 - for (Object obj2 : ((LinkedList) obj1)) { + for (LinkedList obj1 : rule.guardNegatives) { + // 等式間リンクおよびガード匿名リンクの一覧 + HashMap interlinks = new HashMap<>(); + for (ProcessContextEquation obj2 : obj1) { ProcessContextEquation eq = (ProcessContextEquation) obj2; // 等式右辺の自由リンク出現の一覧を取得する Membrane mem = eq.mem; - HashMap rhsfreelinks = mem.freeLinks; + HashMap rhsfreelinks = mem.freeLinks; // 等式左辺の自由リンク出現の一覧を取得し、右辺の一覧と対応を取る ProcessContext a = (ProcessContext) eq.def.lhsOcc; - HashMap rhscxtfreelinks = new HashMap(); // この等式右辺トップレベル$ppの自由リンク集合 + HashMap rhscxtfreelinks = + new HashMap<>(); // この等式右辺トップレベル$ppの自由リンク集合 for (int i = 0; i < a.args.length; i++) { LinkOccurrence lhslnk = a.args[i]; // String linkname = lhslnk.name; @@ -701,10 +716,10 @@ void coupleGuardNegativeLinks(RuleStructure rule) { // {$p[A|*V]} :- \+($p=(f(B),$pp[A,B|*W])) | ... // - Iterator it3 = interlinks.keySet().iterator(); + Iterator it3 = interlinks.keySet().iterator(); anonymouslink: while (it3.hasNext()) { - String linkname = (String) it3.next(); + String linkname = it3.next(); LinkOccurrence lnk = (LinkOccurrence) interlinks.get(linkname); if (lnk.atom.mem.processContexts.isEmpty()) { warning( @@ -725,17 +740,15 @@ void coupleGuardNegativeLinks(RuleStructure rule) { /** 左辺と右辺の自由リンクをつなぐ */ void coupleInheritedLinks(RuleStructure rule) { - HashMap lhsFreeLinks = rule.leftMem.freeLinks; - HashMap rhsFreeLinks = rule.rightMem.freeLinks; - HashMap links = new HashMap(); - for (Object obj : lhsFreeLinks.keySet()) { - String linkname = (String) obj; - LinkOccurrence lhsocc = (LinkOccurrence) lhsFreeLinks.get(linkname); + HashMap lhsFreeLinks = rule.leftMem.freeLinks; + HashMap rhsFreeLinks = rule.rightMem.freeLinks; + HashMap links = new HashMap<>(); + for (String linkname : lhsFreeLinks.keySet()) { + LinkOccurrence lhsocc = lhsFreeLinks.get(linkname); addLinkOccurrence(links, lhsocc); } - for (Object obj : rhsFreeLinks.keySet()) { - String linkname = (String) obj; - LinkOccurrence rhsocc = (LinkOccurrence) rhsFreeLinks.get(linkname); + for (String linkname : rhsFreeLinks.keySet()) { + LinkOccurrence rhsocc = rhsFreeLinks.get(linkname); addLinkOccurrence(links, rhsocc); } removeClosedLinks(links); @@ -744,7 +757,7 @@ void coupleInheritedLinks(RuleStructure rule) { LinkOccurrence link = (LinkOccurrence) links.get(obj); // error("SYNTAX ERROR: rule with free variable: "+ link.name + "\n in " + rule); error("SYNTAX ERROR: rule with free variable: " + link.name + ", at line " + rule.lineno); - LinkedList process = new LinkedList(); + LinkedList process = new LinkedList<>(); process.add(new SrcLink(link.name)); SrcAtom sAtom = new SrcAtom(link.name, process); addSrcAtomToMem(sAtom, link.atom.mem); @@ -761,8 +774,8 @@ void coupleInheritedLinks(RuleStructure rule) { /** ガード型制約の型付きプロセス文脈のリストを作成する。 * @param names コンテキストの限定名 (String) から ContextDef への写像 [in,out] */ - private void enumTypedNames(Membrane mem, HashMap names) { - Iterator it = mem.processContexts.iterator(); + private void enumTypedNames(Membrane mem, HashMap names) { + Iterator it = mem.processContexts.iterator(); while (it.hasNext()) { ProcessContext pc = (ProcessContext) it.next(); String name = pc.getQualifiedName(); @@ -771,10 +784,10 @@ private void enumTypedNames(Membrane mem, HashMap names) { // TODO ガードで出現するからと言って型付きとは限らない pc.def.typed = true; names.put(name, pc.def); - } else pc.def = (ContextDef) names.get(name); + } else pc.def = names.get(name); it.remove(); mem.typedProcessContexts.add(pc); - if (pc.bundle != null) addLinkOccurrence(names, pc.bundle); + // if (pc.bundle != null) addLinkOccurrence(names, pc.bundle); } } @@ -784,17 +797,16 @@ private void enumTypedNames(Membrane mem, HashMap names) { * @param mem 左辺膜、またはガード否定条件内等式制約右辺の構造を保持する膜 * @param names コンテキストの限定名 (String) から ContextDef への写像 [in,out] * @param isLHS 左辺かどうか(def.lhsOccに追加するかどうかの判定に使用される)*/ - private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws ParseException { + private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) + throws ParseException { // 子膜 - Iterator it = mem.mems.iterator(); - while (it.hasNext()) { - Membrane submem = (Membrane) it.next(); + for (Membrane submem : mem.mems) { enumHeadNames(submem, names, isLHS); } // - it = mem.processContexts.iterator(); + Iterator it = mem.processContexts.iterator(); while (it.hasNext()) { - ProcessContext pc = (ProcessContext) it.next(); + ProcessContext pc = it.next(); String name = pc.getQualifiedName(); if (!names.containsKey(name)) { pc.def = new ContextDef(name); @@ -840,10 +852,10 @@ private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws Pa } } if (isLHS) pc.def.lhsOcc = pc; // 左辺での出現を登録 - if (pc.bundle != null) addLinkOccurrence(names, pc.bundle); + // if (pc.bundle != null) addLinkOccurrence(names, pc.bundle); // if (!pc.def.isTyped()) { - HashSet explicitfreelinks = new HashSet(); + HashSet explicitfreelinks = new HashSet<>(); for (int i = 0; i < pc.args.length; i++) { LinkOccurrence lnk = pc.args[i]; if (explicitfreelinks.contains(lnk.name)) { @@ -860,9 +872,9 @@ private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws Pa } } } - it = mem.ruleContexts.iterator(); - while (it.hasNext()) { - RuleContext rc = (RuleContext) it.next(); + Iterator it2 = mem.ruleContexts.iterator(); + while (it2.hasNext()) { + RuleContext rc = it2.next(); String name = rc.getQualifiedName(); if (!names.containsKey(name)) { rc.def = new ContextDef(name); @@ -874,21 +886,19 @@ private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws Pa + name + " at line " + rc.line); - it.remove(); + it2.remove(); } } - it = mem.aggregates.iterator(); - while (it.hasNext()) { - Atom atom = (Atom) it.next(); + for (Atom atom : mem.aggregates) { for (int i = 0; i < atom.args.length; i++) { - addLinkOccurrence(names, atom.args[i]); + // addLinkOccurrence(names, atom.args[i]); } } // if (mem.processContexts.size() > 1) { it = mem.processContexts.iterator(); while (it.hasNext()) { - ProcessContext pc = (ProcessContext) it.next(); + ProcessContext pc = it.next(); if (pc.def.lhsOcc == pc) pc.def.lhsOcc = null; // 左辺での出現の登録を取り消す it.remove(); // namesには残る error( @@ -899,11 +909,11 @@ private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws Pa } } if (mem.ruleContexts.size() > 1) { - it = mem.ruleContexts.iterator(); - while (it.hasNext()) { - RuleContext rc = (RuleContext) it.next(); + it2 = mem.ruleContexts.iterator(); + while (it2.hasNext()) { + RuleContext rc = it2.next(); if (rc.def.lhsOcc == rc) rc.def.lhsOcc = null; // 左辺での出現の登録を取り消す - it.remove(); // namesには残る + it2.remove(); // namesには残る error( "SYNTAX ERROR: head membrane cannot contain more than one rule context: " + rc.def.getName() @@ -934,16 +944,17 @@ private void enumHeadNames(Membrane mem, HashMap names, boolean isLHS) throws Pa /** ボディのプロセス文脈、型付きプロセス文脈、ルール文脈、リンク束のリストを作成する。 * @param names コンテキストの限定名 (String) から ContextDef への写像 [in] */ - private void enumBodyNames(Membrane mem, HashMap names) throws ParseException { - Iterator it = mem.mems.iterator(); + private void enumBodyNames(Membrane mem, HashMap names) + throws ParseException { + Iterator it = mem.mems.iterator(); while (it.hasNext()) { Membrane submem = (Membrane) it.next(); enumBodyNames(submem, names); } // - it = mem.processContexts.iterator(); - while (it.hasNext()) { - ProcessContext pc = (ProcessContext) it.next(); + Iterator it2 = mem.processContexts.iterator(); + while (it2.hasNext()) { + ProcessContext pc = it2.next(); String name = pc.getQualifiedName(); if (!names.containsKey(name)) { error( @@ -951,7 +962,7 @@ private void enumBodyNames(Membrane mem, HashMap names) throws ParseException { + pc.getQualifiedName() + " at line " + pc.line); - it.remove(); + it2.remove(); continue; } else { pc.def = (ContextDef) names.get(name); @@ -963,12 +974,12 @@ private void enumBodyNames(Membrane mem, HashMap names) throws ParseException { + pc + " at line " + pc.line); - it.remove(); + it2.remove(); continue; } } if (pc.def.isTyped()) { - it.remove(); + it2.remove(); // if (pc.args.length >= 1) { // error("SYNTAX ERROR: typed process context occurring in body must have exactly one // explicit free link argument: " + pc + " at line " + pc.line); @@ -985,37 +996,37 @@ private void enumBodyNames(Membrane mem, HashMap names) throws ParseException { } else { if (pc.def.lhsOcc == null) { // 構文エラーによりヘッド出現が取り消された型なし$pは、ボディ出現が無言で取り除かれる。 - it.remove(); + it2.remove(); continue; } } pc.def.rhsOccs.add(pc); } } - it = mem.ruleContexts.iterator(); - while (it.hasNext()) { - RuleContext rc = (RuleContext) it.next(); + Iterator it3 = mem.ruleContexts.iterator(); + while (it3.hasNext()) { + RuleContext rc = it3.next(); String name = (String) rc.getQualifiedName(); if (names.containsKey(name)) { - rc.def = (ContextDef) names.get(name); + rc.def = names.get(name); rc.def.rhsOccs.add(rc); } else { error("SYNTAX ERROR: rule context not appeared in head: " + rc + " at line " + rc.line); - it.remove(); + it3.remove(); } } - it = mem.aggregates.iterator(); - while (it.hasNext()) { - Atom atom = (Atom) it.next(); + Iterator it4 = mem.aggregates.iterator(); + while (it4.hasNext()) { + Atom atom = it4.next(); for (int i = 0; i < atom.args.length; i++) { - addLinkOccurrence(names, atom.args[i]); + // addLinkOccurrence(names, atom.args[i]); } } // if (mem.pragmaAtHost != null) { // @指定は型付きプロセス文脈(仮) ProcessContext pc = mem.pragmaAtHost; String name = pc.getQualifiedName(); - pc.def = (ContextDef) names.get(name); + pc.def = names.get(name); if (pc.def == null) { error("SYSTEM ERROR: contextdef not set for pragma " + name + " at line " + pc.line); } @@ -1026,8 +1037,9 @@ private void enumBodyNames(Membrane mem, HashMap names) throws ParseException { /** 左辺およびガード型制約に対して、プロセス文脈およびルール文脈の名前解決を行う。 * 名前解決により発見された構文エラーを訂正する。 * @return 左辺およびガードに出現する限定名(String) -> ContextDef / LinkOccurrence(Bundles) */ - private HashMap resolveHeadContextNames(RuleStructure rule) throws ParseException { - HashMap names = new HashMap(); + private HashMap resolveHeadContextNames(RuleStructure rule) + throws ParseException { + HashMap names = new HashMap<>(); // 次のメソッド後には型付きプロセス文脈の pc.def.typed が true になる enumTypedNames(rule.guardMem, names); // この時点では型付きプロセス文脈のみ enumHeadNames(rule.leftMem, names, true); // この時点で型なしプロセス文脈およびルール文脈およびリンク束が登録される @@ -1036,9 +1048,9 @@ private HashMap resolveHeadContextNames(RuleStructure rule) throws ParseExceptio // ( ここではやらなくてよいかもしれない ) // 左辺トップレベルのプロセス文脈を削除する - Iterator it = rule.leftMem.processContexts.iterator(); + Iterator it = rule.leftMem.processContexts.iterator(); while (it.hasNext()) { - ProcessContext pc = (ProcessContext) it.next(); + ProcessContext pc = it.next(); error( "SYNTAX ERROR: untyped head process context requires an enclosing membrane: " + pc @@ -1053,26 +1065,24 @@ private HashMap resolveHeadContextNames(RuleStructure rule) throws ParseExceptio /** ガード否定条件および右辺に対して、プロセス文脈およびルール文脈の名前解決を行う。 * 名前解決により発見された構文エラーを訂正する。*/ - private void resolveContextNames(RuleStructure rule, HashMap names) throws ParseException { + private void resolveContextNames(RuleStructure rule, HashMap names) + throws ParseException { // 同じ名前のプロセス文脈の引数パターンを同じにする。 // 型付きは明示的な自由リンクの個数を1にする。 - Iterator it; - // ガード否定条件 - it = rule.guardNegatives.iterator(); - while (it.hasNext()) { - Iterator it2 = ((LinkedList) it.next()).iterator(); - HashMap tmpnames = (HashMap) names.clone(); // 他の条件やボディとは関係ないため - HashSet cxtnames = new HashSet(); - while (it2.hasNext()) { - ProcessContextEquation eq = (ProcessContextEquation) it2.next(); + for (LinkedList gn : rule.guardNegatives) { + Iterator it = gn.iterator(); + HashMap tmpnames = new HashMap<>(names); // 他の条件やボディとは関係ないため + HashSet cxtnames = new HashSet<>(); + while (it.hasNext()) { + ProcessContextEquation eq = it.next(); String cxtname = eq.def.getName(); if (cxtnames.contains(cxtname)) { error( "SYNTAX ERROR: process context constrained more than once in a negative condition: " + cxtname); - it2.remove(); + it.remove(); } else { cxtnames.add(cxtname); enumHeadNames(eq.mem, tmpnames, false); @@ -1089,11 +1099,9 @@ private void resolveContextNames(RuleStructure rule, HashMap names) throws Parse // todo 右辺のアトム集団のリンク先が全て同じプロセス文脈名を持つことを確認する // rule.processContexts/ruleContexts/typedProcessContexts を生成する - it = names.keySet().iterator(); - while (it.hasNext()) { - String name = (String) it.next(); - Object obj = names.get(name); - if (obj instanceof LinkOccurrence) continue; // リンク束のときは無視 + for (String name : names.keySet()) { + ContextDef obj = names.get(name); + // if (obj instanceof LinkOccurrence) continue; // リンク束のときは無視 ContextDef def = (ContextDef) obj; if (def.isTyped()) { rule.typedProcessContexts.put(name, def); @@ -1121,9 +1129,7 @@ private void resolveContextNames(RuleStructure rule, HashMap names) throws Parse } // (非線型プロセス文脈が実装されるまでの仮措置として)線型でなく剰余引数が[]でない型なし$pを取り除く - it = rule.processContexts.values().iterator(); - while (it.hasNext()) { - ContextDef def = (ContextDef) it.next(); + for (ContextDef def : rule.processContexts.values()) { if (def.rhsOccs.size() != 1 && ((ProcessContext) def.lhsOcc).bundle != null) { error( "FEATURE NOT IMPLEMENTED: untyped process context must be linear unless its bundle is" @@ -1189,27 +1195,34 @@ class SyntaxExpander { void expandRuleAbbreviations(SrcRule sRule) { // ガードを型制約と否定条件に分類する flatten(sRule.getGuard()); - ListIterator lit = sRule.getGuard().listIterator(); + // 中間形式変換前の(生の)ガード否定条件 + LinkedList rawGNs = new LinkedList<>(); + ListIterator lit = sRule.getGuard().listIterator(); while (lit.hasNext()) { - Object obj = lit.next(); + SrcElement obj = lit.next(); if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; if (sAtom.getName().equals("\\+") && sAtom.getProcess().size() == 1) { lit.remove(); - sRule.getGuardNegatives().add(sAtom.getProcess().getFirst()); + rawGNs.add(sAtom.getProcess().getFirst()); } } } - LinkedList typeConstraints = sRule.getGuard(); - LinkedList guardNegatives = sRule.getGuardNegatives(); + LinkedList typeConstraints = sRule.getGuard(); + LinkedList>> guardNegatives = + sRule.getGuardNegatives(); // - ガード否定条件の根本的な構文エラーを訂正し、各否定条件を[$p,[Q]]のリストという中間表現に変換する - correctGuardNegatives(guardNegatives); + correctGuardNegatives(guardNegatives, rawGNs); // - 数値の正負号の取り込み incorporateSignSymbols(sRule.getHead()); incorporateSignSymbols(typeConstraints); - incorporateSignSymbols(guardNegatives); + for (LinkedList> gn : guardNegatives) { + for (Map.Entry e : gn) { + incorporateSignSymbols(e.getValue().list); + } + } incorporateSignSymbols(sRule.getBody()); // - モジュール名のアトムファンクタへの取り込み @@ -1223,7 +1236,11 @@ void expandRuleAbbreviations(SrcRule sRule) { // - アトム展開(アトム引数の再帰的な展開) expandAtoms(sRule.getHead()); - expandAtoms(guardNegatives); + for (LinkedList> gn : guardNegatives) { + for (Map.Entry e : gn) { + expandAtoms(e.getValue().list); + } + } expandAtoms(sRule.getBody()); // - 左辺と右辺の@指定を処理する @@ -1237,10 +1254,15 @@ void expandRuleAbbreviations(SrcRule sRule) { correctTypeConstraints(typeConstraints); // - 型制約に出現するリンク名Xに対して、ルール内の全てのXを$Xに置換する - HashMap typedLinkNameMap = computeTypedLinkNameMap(typeConstraints); // " X"->"X" + HashMap typedLinkNameMap = + computeTypedLinkNameMap(typeConstraints); // " X"->"X" unabbreviateTypedLinks(sRule.getHead(), typedLinkNameMap); unabbreviateTypedLinks(typeConstraints, typedLinkNameMap); - unabbreviateTypedLinks(guardNegatives, typedLinkNameMap); + for (LinkedList> gn : guardNegatives) { + for (Map.Entry e : gn) { + unabbreviateTypedLinks(e.getValue().list, typedLinkNameMap); + } + } unabbreviateTypedLinks(sRule.getBody(), typedLinkNameMap); // - 構造代入 @@ -1248,7 +1270,7 @@ void expandRuleAbbreviations(SrcRule sRule) { // todo 実装する // // 実装しました。便宜上、"同名型付きプロセス文脈の分離"と呼んでいます // // 現状では、-hl系を指定した場合のみ使用可能 (10/09/29 seiji) - HashMap ruleProcNameMap = new HashMap(); + HashMap ruleProcNameMap = new HashMap<>(); if (Env.hyperLink) sameTypedProcessContext(sRule.getHead(), typeConstraints, ruleProcNameMap); // - 構造比較 @@ -1263,7 +1285,11 @@ void expandRuleAbbreviations(SrcRule sRule) { // todo $pを強制的に$p[X]に展開すると$p[X|*V]に展開できる可能性を制限しているのを何とかする expandTypedProcessContexts(sRule.getHead()); expandTypedProcessContexts(typeConstraints); - expandTypedProcessContexts(guardNegatives); + for (LinkedList> gn : guardNegatives) { + for (Map.Entry e : gn) { + expandTypedProcessContexts(e.getValue().list); + } + } expandTypedProcessContexts(sRule.getBody()); // - 中間命令findproccxt用の処理(--hl, --hl-opt限定) //seiji @@ -1286,44 +1312,45 @@ void expandRuleAbbreviations(SrcRule sRule) { /** ガード否定条件の根本的な構文エラーを訂正し、各否定条件を[$p,[Q]]のリストという中間形式に変換する。 * この中間形式は、アトム展開などを透過的に行うために採用された。*/ - private void correctGuardNegatives(LinkedList guardNegatives) { - ListIterator lit = guardNegatives.listIterator(); + private void correctGuardNegatives( + LinkedList>> guardNegatives, + LinkedList rawGNs) { + ListIterator lit = rawGNs.listIterator(); while (lit.hasNext()) { - Object obj = lit.next(); - LinkedList eqlist; + SrcElement obj = lit.next(); + LinkedList eqlist; // \+の引数をリストに再構成する - if (obj instanceof LinkedList) { - eqlist = (LinkedList) obj; + if (obj instanceof SrcList) { + eqlist = ((SrcList) obj).list; flatten(eqlist); } else { - eqlist = new LinkedList(); + eqlist = new LinkedList<>(); eqlist.add(obj); } - lit.remove(); - lit.add(eqlist); + // lit.remove(); + LinkedList> ans = new LinkedList<>(); + guardNegatives.add(ans); // リストの要素のうち、$p=Q のみを[$p,[Q]]として残す。 - ListIterator lit2 = eqlist.listIterator(); + ListIterator lit2 = eqlist.listIterator(); while (lit2.hasNext()) { - Object obj2 = lit2.next(); + SrcElement obj2 = lit2.next(); lit2.remove(); if (obj2 instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj2; if (sAtom.getName().equals("=") && sAtom.getProcess().size() == 2) { Object lhs = sAtom.getProcess().getFirst(); if (lhs instanceof SrcProcessContext) { - if (((SrcProcessContext) lhs).args != null) { + SrcProcessContext lhs1 = (SrcProcessContext) lhs; + if (lhs1.args != null) { warning( "WARNING: argument of constrained process context is ignored: " - + SrcDumper.dump(lhs).replaceAll("\n", "")); - ((SrcProcessContext) lhs).args = null; + + SrcDumper.dump(lhs1).replaceAll("\n", "")); + lhs1.args = null; } - Object rhs = sAtom.getProcess().get(1); - LinkedList list = new LinkedList(); - LinkedList rhslist = new LinkedList(); - list.add(lhs); - list.add(rhslist); + SrcElement rhs = sAtom.getProcess().get(1); + LinkedList rhslist = new LinkedList<>(); rhslist.add(rhs); - lit2.add(list); + ans.add(new AbstractMap.SimpleImmutableEntry<>(lhs1, new SrcList(rhslist))); continue; } } @@ -1341,10 +1368,10 @@ private void correctGuardNegatives(LinkedList guardNegatives) { * '-'(x) → '-x' * */ - void incorporateSignSymbols(LinkedList process) { - ListIterator it = process.listIterator(); + void incorporateSignSymbols(LinkedList process) { + ListIterator it = process.listIterator(); while (it.hasNext()) { - Object obj = it.next(); + SrcElement obj = it.next(); if (obj instanceof SrcAtom) { SrcAtom atom = (SrcAtom) obj; if (atom.getProcess().size() == 1 @@ -1360,8 +1387,8 @@ void incorporateSignSymbols(LinkedList process) { incorporateSignSymbols(atom.getProcess()); } else if (obj instanceof SrcMembrane) { incorporateSignSymbols(((SrcMembrane) obj).getProcess()); - } else if (obj instanceof LinkedList) { - incorporateSignSymbols((LinkedList) obj); + } else if (obj instanceof SrcList) { + incorporateSignSymbols(((SrcList) obj).list); } } } @@ -1409,10 +1436,10 @@ void incorporateSignSymbols(LinkedList process) { * f(t1..tn) = $p → f(t1..tn,$p) * */ - private void shrinkUnificationConstraints(LinkedList process) { - ListIterator it = process.listIterator(); + private void shrinkUnificationConstraints(LinkedList process) { + ListIterator it = process.listIterator(); while (it.hasNext()) { - Object obj = it.next(); + SrcElement obj = it.next(); if (obj instanceof SrcAtom) { SrcAtom atom = (SrcAtom) obj; if (!atom.getName().equals("=")) continue; @@ -1435,14 +1462,14 @@ private void shrinkUnificationConstraints(LinkedList process) { * (t1,,tn) → t1,,tn * */ - private void flatten(LinkedList process) { - LinkedList srcprocess = (LinkedList) process.clone(); + private void flatten(LinkedList process) { + LinkedList srcprocess = new LinkedList<>(process); process.clear(); - ListIterator it = srcprocess.listIterator(); + ListIterator it = srcprocess.listIterator(); while (it.hasNext()) { - Object obj = it.next(); - if (obj instanceof LinkedList) { - LinkedList list = (LinkedList) obj; + SrcElement obj = it.next(); + if (obj instanceof SrcList) { + LinkedList list = ((SrcList) obj).list; flatten(list); process.addAll(list); } else process.add(obj); @@ -1457,19 +1484,19 @@ private void flatten(LinkedList process) { * f(s1, (t1,,tn),sm) → f(s1,X,sm), ','(t1,(t2,,tn),X) * */ - void expandAtoms(LinkedList process) { - LinkedList srcprocess = (LinkedList) process.clone(); + void expandAtoms(LinkedList process) { + LinkedList srcprocess = new LinkedList<>(process); process.clear(); - ListIterator it = srcprocess.listIterator(); + ListIterator it = srcprocess.listIterator(); while (it.hasNext()) { - Object obj = it.next(); + SrcElement obj = it.next(); process.add(obj); if (obj instanceof SrcAtom) { expandAtom((SrcAtom) obj, process); } else if (obj instanceof SrcMembrane) { expandAtoms(((SrcMembrane) obj).getProcess()); - } else if (obj instanceof LinkedList) { - expandAtoms((LinkedList) obj); + } else if (obj instanceof SrcList) { + expandAtoms(((SrcList) obj).list); } } } @@ -1478,10 +1505,10 @@ void expandAtoms(LinkedList process) { * @param sAtom アトム展開するアトム。戻るときには破壊される。 * @param result アトム展開結果のオブジェクト列を追加するリストオブジェクト(プロセス構造) */ - private void expandAtom(SrcAtom sAtom, LinkedList result) { - LinkedList process = sAtom.getProcess(); + private void expandAtom(SrcAtom sAtom, LinkedList result) { + LinkedList process = sAtom.getProcess(); for (int i = 0; i < process.size(); i++) { - Object obj = process.get(i); + SrcElement obj = process.get(i); // アトム if (obj instanceof SrcAtom) { SrcAtom subatom = (SrcAtom) obj; @@ -1507,8 +1534,8 @@ else if (obj instanceof SrcMembrane) { expandAtoms(submem.getProcess()); } // 項組(仮) - else if (obj instanceof LinkedList) { - LinkedList list = (LinkedList) obj; + else if (obj instanceof SrcList) { + LinkedList list = ((SrcList) obj).list; if (list.isEmpty()) { SrcAtom subatom = new SrcAtom("()"); // @@ -1527,7 +1554,7 @@ else if (obj instanceof LinkedList) { if (list.size() == 1) { subatom.getProcess().add(list.getFirst()); } else { - subatom.getProcess().add(list); + subatom.getProcess().add(new SrcList(list)); } subatom.getProcess().add(new SrcLink(newlinkname)); // @@ -1540,15 +1567,14 @@ else if (obj instanceof LinkedList) { /** アトム展開後のプロセス構造(子ルール外)に出現するリンク名およびコンテキスト名を枚挙する。 * @param names 限定名 (String) からコンテキスト出現のLinkedListへの写像 [in,out] */ - private void enumNames(LinkedList process, HashMap names) { - Iterator it = process.iterator(); - while (it.hasNext()) { - Object obj = it.next(); + private void enumNames( + LinkedList process, HashMap> names) { + for (SrcElement obj : process) { // アトム if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { - Object subobj = sAtom.getProcess().get(i); + SrcElement subobj = sAtom.getProcess().get(i); if (subobj instanceof SrcContext) { addNameOccurrence((SrcContext) subobj, names); } @@ -1565,12 +1591,13 @@ else if (obj instanceof SrcProcessContext || obj instanceof SrcRuleContext) { } } - private void addNameOccurrence(SrcContext sContext, HashMap names) { + private void addNameOccurrence( + SrcContext sContext, HashMap> names) { String name = sContext.getQualifiedName(); if (!names.containsKey(name)) { - names.put(name, new LinkedList()); + names.put(name, new LinkedList<>()); } - ((LinkedList) names.get(name)).add(sContext); + names.get(name).add(sContext); } /** unabbreviateTypedLinksで使うための写像を生成する。 @@ -1578,14 +1605,14 @@ private void addNameOccurrence(SrcContext sContext, HashMap names) { * 対応する型付きプロセス文脈名テキスト "X" (String) への写像 *

todo もはや不要。単にリンク名テキスト "X" から生成するように修正すべきである。 */ - HashMap computeTypedLinkNameMap(LinkedList typeConstraints) { - HashMap typedLinkNameMap = new HashMap(); - HashMap typedNames = new HashMap(); + HashMap computeTypedLinkNameMap(LinkedList typeConstraints) { + HashMap typedLinkNameMap = new HashMap<>(); + HashMap> typedNames = new HashMap<>(); enumNames(typeConstraints, typedNames); - Iterator it = typedNames.keySet().iterator(); + Iterator it = typedNames.keySet().iterator(); while (it.hasNext()) { - String name = (String) it.next(); - Object obj = ((LinkedList) typedNames.get(name)).getFirst(); + String name = it.next(); + SrcContext obj = typedNames.get(name).getFirst(); if (obj instanceof SrcLink) { typedLinkNameMap.put(name, ((SrcLink) obj).getName()); } @@ -1599,10 +1626,9 @@ HashMap computeTypedLinkNameMap(LinkedList typeConstraints) { * 対応する型付きプロセス文脈名テキスト "X" (String) への写像 *

 p(s1,X,sn) → p(s1,$X,sn)
    * 
*/ - private void unabbreviateTypedLinks(LinkedList process, HashMap typedLinkNameMap) { - Iterator it = process.iterator(); - while (it.hasNext()) { - Object obj = it.next(); + private void unabbreviateTypedLinks( + LinkedList process, HashMap typedLinkNameMap) { + for (SrcElement obj : process) { if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { @@ -1628,8 +1654,8 @@ private void unabbreviateTypedLinks(LinkedList process, HashMap typedLinkNameMap } } unabbreviateTypedLinks(sMem.getProcess(), typedLinkNameMap); - } else if (obj instanceof LinkedList) { - unabbreviateTypedLinks((LinkedList) obj, typedLinkNameMap); + } else if (obj instanceof SrcList) { + unabbreviateTypedLinks(((SrcList) obj).list, typedLinkNameMap); } } } @@ -1640,9 +1666,11 @@ private void unabbreviateTypedLinks(LinkedList process, HashMap typedLinkNameMap * */ private void sameTypedProcessContext( - LinkedList head, LinkedList cons, HashMap ruleProcNameMap) { // seiji - HashMap usedProcNameMap = new HashMap(); // 既に出現しているプロセス文脈名 - int j = 0; + LinkedList head, + LinkedList cons, + HashMap ruleProcNameMap) { // seiji + HashMap usedProcNameMap = new HashMap<>(); // 既に出現しているプロセス文脈名 + // int j = 0; /* ガード制約で出現するプロセス文脈の名前表を作成 */ processContextNameMap(head, ruleProcNameMap); @@ -1654,10 +1682,9 @@ private void sameTypedProcessContext( /** 型付きプロセス文脈の名前表を作成する */ // seiji - private void processContextNameMap(LinkedList list, HashMap ruleProcNameMap) { - ListIterator it = list.listIterator(); - while (it.hasNext()) { - Object obj = it.next(); + private void processContextNameMap( + LinkedList list, HashMap ruleProcNameMap) { + for (SrcElement obj : list) { if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { @@ -1677,15 +1704,16 @@ private void processContextNameMap(LinkedList list, HashMap ruleProcNameMap) { /** ヘッドに同名のプロセス文脈が出現する場合には、ユニークな名前に変更する */ private void separateProcessContext( - LinkedList head, LinkedList cons, HashMap ruleProcNameMap, HashMap usedProcNameMap) { // seiji - ListIterator it = head.listIterator(); + LinkedList head, + LinkedList cons, + HashMap ruleProcNameMap, + HashMap usedProcNameMap) { // seiji int j = 0; - while (it.hasNext()) { - Object obj = it.next(); + for (SrcElement obj : head) { if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { - Object subobj = sAtom.getProcess().get(i); + SrcElement subobj = sAtom.getProcess().get(i); if (subobj instanceof SrcProcessContext) { SrcProcessContext srcProcessContext = (SrcProcessContext) subobj; String name = srcProcessContext.getName(); @@ -1700,7 +1728,7 @@ private void separateProcessContext( usedProcNameMap.put(newName, srcProcessContext); ruleProcNameMap.put(newName, srcProcessContext); - LinkedList procList = new LinkedList(); + LinkedList procList = new LinkedList<>(); procList.add(new SrcProcessContext(name)); procList.add(new SrcProcessContext(newName)); SrcAtom sa = new SrcAtom("==", procList); @@ -1708,11 +1736,11 @@ private void separateProcessContext( /* --hl-optではガードにhlink型チェックを追加して、構造比較にかかる時間を短縮している */ if (Env.hyperLinkOpt) { - LinkedList procList2 = new LinkedList(); + LinkedList procList2 = new LinkedList<>(); procList2.add(new SrcProcessContext(name)); SrcAtom sa2 = new SrcAtom("unary", procList2); cons.add(sa2); - LinkedList procList3 = new LinkedList(); + LinkedList procList3 = new LinkedList<>(); procList3.add(new SrcProcessContext(newName)); SrcAtom sa3 = new SrcAtom("unary", procList3); cons.add(sa3); @@ -1721,7 +1749,7 @@ private void separateProcessContext( /* オリジナルの名前を持つ型付きプロセス文脈に、新しい名前を記憶させる */ SrcProcessContext oriProcessContext = (SrcProcessContext) ruleProcNameMap.get(name); if (oriProcessContext.getSameNameList() == null) { - oriProcessContext.sameNameList = new LinkedList(); + oriProcessContext.sameNameList = new LinkedList<>(); } oriProcessContext.getSameNameList().add(newName); } else { @@ -1742,23 +1770,23 @@ private void separateProcessContext( *

メソッドの名前とは異なり、型付きでないプロセス文脈も展開する仕様になっている。 *

todo $p[X|*p] に展開すべき場合もあるはず */ - private void expandTypedProcessContexts(LinkedList process) { - ListIterator it = process.listIterator(); + private void expandTypedProcessContexts(LinkedList process) { + ListIterator it = process.listIterator(); while (it.hasNext()) { - Object obj = it.next(); + SrcElement obj = it.next(); if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { - Object subobj = sAtom.getProcess().get(i); + SrcElement subobj = sAtom.getProcess().get(i); if (subobj instanceof SrcProcessContext) { SrcProcessContext srcProcessContext = (SrcProcessContext) subobj; - String name = srcProcessContext.getQualifiedName(); + // String name = srcProcessContext.getQualifiedName(); String newlinkname = generateNewLinkName(); sAtom.getProcess().set(i, new SrcLink(newlinkname)); srcProcessContext.linkName = newlinkname; // seiji it.add(srcProcessContext); // アトム引数に$p[...]を許すように構文拡張された場合のみ args!=null となる - if (srcProcessContext.args == null) srcProcessContext.args = new LinkedList(); + if (srcProcessContext.args == null) srcProcessContext.args = new LinkedList<>(); srcProcessContext.args.add(new SrcLink(newlinkname)); } } @@ -1774,14 +1802,14 @@ private void expandTypedProcessContexts(LinkedList process) { * SrcProcessContextに保持させる * */ private void procCxtNameToLinkName( - LinkedList head, LinkedList cons, HashMap ruleProcNameMap) { // seiji - ListIterator it = head.listIterator(); - while (it.hasNext()) { - Object obj = it.next(); + LinkedList head, + LinkedList cons, + HashMap ruleProcNameMap) { // seiji + for (SrcElement obj : head) { if (obj instanceof SrcProcessContext) { SrcProcessContext spc = (SrcProcessContext) obj; if (spc.hasSameNameList()) { - LinkedList temp = new LinkedList(); + LinkedList temp = new LinkedList<>(); SrcProcessContext subspc; for (int j = 0; j < spc.getSameNameList().size(); j++) { subspc = (SrcProcessContext) ruleProcNameMap.get(spc.getSameNameList().get(j)); @@ -1827,10 +1855,9 @@ else if (obj instanceof SrcMembrane) { * (2) {..}@Hに対して、ガード型制約 cmd(H) を追加する。 *

左辺の場合のpragmaフィールドへの登録は、addProcessToMemで行う。 * @param cmd 右辺ならば"connectRuntime"を、左辺ならば"string"を渡すこと。(2)で使用される。*/ - void correctPragma(LinkedList typeConstraints, LinkedList process, String cmd) { - Iterator it = process.iterator(); - while (it.hasNext()) { - Object obj = it.next(); + void correctPragma( + LinkedList typeConstraints, LinkedList process, String cmd) { + for (SrcElement obj : process) { if (obj instanceof SrcMembrane) { SrcMembrane sMem = (SrcMembrane) obj; correctPragma(typeConstraints, sMem.process, cmd); @@ -1847,7 +1874,7 @@ void correctPragma(LinkedList typeConstraints, LinkedList process, String cmd) { } if (sMem.pragma instanceof SrcLink) { // (2) | {..}@H → cmd(H) | {..}@H - LinkedList args = new LinkedList(); + LinkedList args = new LinkedList<>(); args.add(new SrcLink(((SrcLink) sMem.pragma).getName())); typeConstraints.add(new SrcAtom(cmd, args)); continue; @@ -1856,7 +1883,7 @@ void correctPragma(LinkedList typeConstraints, LinkedList process, String cmd) { SrcProcessContext sProcCxt = (SrcProcessContext) sMem.pragma; if (sProcCxt.args == null && sProcCxt.bundle == null) { // (2) | {..}@($h) → cmd($h) | {..}@($h) - LinkedList args = new LinkedList(); + LinkedList args = new LinkedList<>(); args.add(new SrcProcessContext(sProcCxt.getName())); typeConstraints.add(new SrcAtom(cmd, args)); continue; @@ -1877,14 +1904,14 @@ void correctPragma(LinkedList typeConstraints, LinkedList process, String cmd) { /** アトム展開後のプロセス構造(ガードの型制約)に対して、 * 膜やルール文脈やルールやリンク束やトップレベルのプロセス文脈が存在したら * コンパイルエラーとする。アトム引数での出現は無名のプロセス変数で置換する。*/ - private void correctTypeConstraints(LinkedList process) { - Iterator it = process.iterator(); + private void correctTypeConstraints(LinkedList process) { + Iterator it = process.iterator(); while (it.hasNext()) { - Object obj = it.next(); + SrcElement obj = it.next(); if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; for (int i = 0; i < sAtom.getProcess().size(); i++) { - Object subobj = sAtom.getProcess().get(i); + SrcElement subobj = sAtom.getProcess().get(i); if (subobj instanceof SrcLink) { } else if (subobj instanceof SrcProcessContext) { } else { @@ -1907,12 +1934,12 @@ private void correctTypeConstraints(LinkedList process) { /** アトム展開後のプロセス構造(ソースファイル)(ルール外)に対して、 * プロセス文脈やルール文脈やリンク束が出現したらコンパイルエラーとする。 * アトム引数での出現は無名のリンクで置換する。*/ - void correctWorld(LinkedList process) { - Iterator it = process.iterator(); + void correctWorld(LinkedList process) { + Iterator it = process.iterator(); while (it.hasNext()) { - Object obj = it.next(); - if (obj instanceof LinkedList) { - LinkedList list = (LinkedList) obj; + SrcElement obj = it.next(); + if (obj instanceof SrcList) { + LinkedList list = ((SrcList) obj).list; correctWorld(list); } else if (obj instanceof SrcAtom) { SrcAtom sAtom = (SrcAtom) obj; @@ -1978,12 +2005,12 @@ HashSet getTopAtomNameSet() { return TopAtomNameSet; } - private void addToTopAtomNameSet(String name) { - if (name.matches("[\\w]*") - && !name.matches("^[0-9]") - && !name.equals("int") - && !name.equals("unary") - && !name.equals("ground") - && !name.equals("uniq")) TopAtomNameSet.add(name); - } + // private void addToTopAtomNameSet(String name) { + // if (name.matches("[\\w]*") + // && !name.matches("^[0-9]") + // && !name.equals("int") + // && !name.equals("unary") + // && !name.equals("ground") + // && !name.equals("uniq")) TopAtomNameSet.add(name); + // } } diff --git a/src/compile/parser/SrcAtom.java b/src/compile/parser/SrcAtom.java index 1166a8f4..d9017814 100644 --- a/src/compile/parser/SrcAtom.java +++ b/src/compile/parser/SrcAtom.java @@ -8,10 +8,10 @@ /** ソースファイル中のアトム表現 */ @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE) -class SrcAtom { +class SrcAtom extends SrcElement { @JsonTypeInfo(use = Id.CLASS) - protected LinkedList process = null; + protected LinkedList process = null; /** 名前トークン */ protected SrcName srcname; @@ -43,7 +43,7 @@ public SrcAtom(String name) { * @param srcname 名前トークン */ public SrcAtom(SrcName srcname) { - this(srcname, new LinkedList(), -1, -1); + this(srcname, new LinkedList<>(), -1, -1); } /** @@ -51,7 +51,7 @@ public SrcAtom(SrcName srcname) { * @param name アトム名 * @param process 子供プロセス */ - public SrcAtom(String name, LinkedList process) { + public SrcAtom(String name, LinkedList process) { this(new SrcName(name), process, -1, -1); } @@ -60,7 +60,7 @@ public SrcAtom(String name, LinkedList process) { * @param srcname 名前トークン * @param process 子供プロセス */ - public SrcAtom(SrcName srcname, LinkedList process) { + public SrcAtom(SrcName srcname, LinkedList process) { this(srcname, process, -1, -1); } @@ -72,7 +72,7 @@ public SrcAtom(SrcName srcname, LinkedList process) { * @param column ソースコード上での出現位置(桁) */ public SrcAtom(SrcName srcname, int line, int column) { - this(srcname, new LinkedList(), line, column); + this(srcname, new LinkedList<>(), line, column); } /** @@ -83,7 +83,7 @@ public SrcAtom(SrcName srcname, int line, int column) { * @param line ソースコード上での出現位置(行) * @param column ソースコード上での出現位置(桁) */ - public SrcAtom(SrcName nametoken, LinkedList process, int line, int column) { + public SrcAtom(SrcName nametoken, LinkedList process, int line, int column) { this.srcname = nametoken; this.process = process; this.line = line; @@ -121,12 +121,12 @@ public int getNameType() { * このアトムの子プロセスを得ます * @return 子プロセスのリスト */ - public LinkedList getProcess() { + public LinkedList getProcess() { return process; } public SrcAtom clone() { - return new SrcAtom(srcname.clone(), (LinkedList) process.clone(), line, column); + return new SrcAtom(srcname.clone(), new LinkedList(process), line, column); } public String toString() { diff --git a/src/compile/parser/SrcContext.java b/src/compile/parser/SrcContext.java index 244c5b64..5bbd552c 100644 --- a/src/compile/parser/SrcContext.java +++ b/src/compile/parser/SrcContext.java @@ -8,7 +8,7 @@ *

プロセス文脈名およびルール文脈名には '...' や [[...]] が使えないようにした。 */ @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.ANY) -abstract class SrcContext { +abstract class SrcContext extends SrcElement { protected String name = null; protected int lineno = -1; diff --git a/src/compile/parser/SrcDumper.java b/src/compile/parser/SrcDumper.java index d6eb2134..84fc8996 100644 --- a/src/compile/parser/SrcDumper.java +++ b/src/compile/parser/SrcDumper.java @@ -22,7 +22,7 @@ public static String dumpAtom(SrcAtom atom) { return s; } - public static String dumpLinkedList(LinkedList list, String sep) { + public static String dumpLinkedList(LinkedList list, String sep) { if (list == null || list.size() == 0) return ""; String s = ""; s += dump(list.get(0)); @@ -77,7 +77,7 @@ public static String dumpTypeDef(SrcTypeDef typedef) { return s; } - public static String dump(Object obj) { + public static String dump(SrcElement obj) { if (obj instanceof SrcLink) { return dumpLink((SrcLink) obj); } else if (obj instanceof SrcAtom) { @@ -90,8 +90,8 @@ public static String dump(Object obj) { return dumpProcessContext((SrcProcessContext) obj); } else if (obj instanceof SrcRuleContext) { return dumpRuleContext((SrcRuleContext) obj); - } else if (obj instanceof LinkedList) { - return dumpLinkedList((LinkedList) obj, ", "); + } else if (obj instanceof SrcList) { + return dumpLinkedList(((SrcList) obj).list, ", "); } else if (obj instanceof SrcTypeDef) { return dumpTypeDef((SrcTypeDef) obj); } diff --git a/src/compile/parser/SrcElement.java b/src/compile/parser/SrcElement.java new file mode 100644 index 00000000..94b3cd1f --- /dev/null +++ b/src/compile/parser/SrcElement.java @@ -0,0 +1,3 @@ +package compile.parser; + +abstract class SrcElement {} diff --git a/src/compile/parser/SrcList.java b/src/compile/parser/SrcList.java new file mode 100644 index 00000000..77f44526 --- /dev/null +++ b/src/compile/parser/SrcList.java @@ -0,0 +1,15 @@ +package compile.parser; + +import java.util.LinkedList; + +class SrcList extends SrcElement { + LinkedList list; + + public SrcList() { + this(new LinkedList<>()); + } + + public SrcList(LinkedList list) { + this.list = list; + } +} diff --git a/src/compile/parser/SrcMembrane.java b/src/compile/parser/SrcMembrane.java index 5cd378ee..186506a4 100644 --- a/src/compile/parser/SrcMembrane.java +++ b/src/compile/parser/SrcMembrane.java @@ -7,11 +7,11 @@ /** * ソースファイル中の膜表現 */ -class SrcMembrane { +class SrcMembrane extends SrcElement { /** 膜の内容プロセスの表現 */ @JsonTypeInfo(use = Id.CLASS) - LinkedList process = null; + LinkedList process = null; /** 終了フラグの有無 */ public boolean stable = false; @@ -20,7 +20,7 @@ class SrcMembrane { public int kind = 0; /** @指定またはnull */ - Object pragma = null; + SrcElement pragma = null; /** 膜名 */ public String name; @@ -29,14 +29,14 @@ class SrcMembrane { * 空の膜を作成します */ public SrcMembrane() { - this(new LinkedList()); + this(new LinkedList<>()); } /** * 指定された子プロセスを持つ膜を作成します * @param process 膜に含まれる子プロセス */ - public SrcMembrane(LinkedList process) { + public SrcMembrane(LinkedList process) { this.process = process; } @@ -44,7 +44,7 @@ public SrcMembrane(LinkedList process) { * 子プロセスを取得します * @return 子プロセスのリスト */ - public LinkedList getProcess() { + public LinkedList getProcess() { return process; } diff --git a/src/compile/parser/SrcProcessContext.java b/src/compile/parser/SrcProcessContext.java index 11d39b2c..35cc207f 100644 --- a/src/compile/parser/SrcProcessContext.java +++ b/src/compile/parser/SrcProcessContext.java @@ -17,13 +17,13 @@ class SrcProcessContext extends SrcContext { *

利用側でLinkedListを生成して代入すること */ @JsonTypeInfo(use = Id.CLASS) - public LinkedList args = null; + public LinkedList args = null; /** リンク束 */ public SrcLinkBundle bundle = null; /** 分離した同名型付きプロセス文脈の名前を格納 */ - public LinkedList sameNameList = null; + public LinkedList sameNameList = null; /** リンク名 */ public String linkName = null; @@ -56,7 +56,7 @@ public String getQualifiedName() { return "$" + name; } - public LinkedList getSameNameList() { + public LinkedList getSameNameList() { return sameNameList; } diff --git a/src/compile/parser/SrcRule.java b/src/compile/parser/SrcRule.java index d4177d82..581f9441 100644 --- a/src/compile/parser/SrcRule.java +++ b/src/compile/parser/SrcRule.java @@ -5,26 +5,27 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import java.util.LinkedList; -import java.util.List; +import java.util.Map; /** * ソース中のルールを表します */ @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE) -class SrcRule { +class SrcRule extends SrcElement { public String name; // ルール名 public int lineno; // 行番号 2006.1.22 by inui - public LinkedList head; // ヘッドプロセス + public LinkedList head; // ヘッドプロセス @JsonTypeInfo(use = Id.CLASS) - public LinkedList body; // ボディプロセス + public LinkedList body; // ボディプロセス @JsonTypeInfo(use = Id.CLASS) - public LinkedList guard; // ガードプロセス + public LinkedList guard; // ガードプロセス @JsonTypeInfo(use = Id.CLASS) - public LinkedList guardNegatives; // ガード否定条件構文のリスト + public LinkedList>> + guardNegatives; // ガード否定条件構文のリスト private String text; // ルールのテキスト表現 @@ -33,8 +34,8 @@ class SrcRule { * @param head ヘッドのリスト * @param body ボディのリスト */ - public SrcRule(String name, LinkedList head, LinkedList body) { - this(name, head, new LinkedList(), body); + public SrcRule(String name, LinkedList head, LinkedList body) { + this(name, head, new LinkedList<>(), body); } // 2006.1.22 by inui @@ -44,8 +45,9 @@ public SrcRule(String name, LinkedList head, LinkedList body) { * @param body ボディのリスト * @param lineno 行番号 */ - public SrcRule(String name, LinkedList head, LinkedList body, int lineno) { - this(name, head, new LinkedList(), body); + public SrcRule( + String name, LinkedList head, LinkedList body, int lineno) { + this(name, head, new LinkedList<>(), body); this.lineno = lineno; } @@ -55,11 +57,15 @@ public SrcRule(String name, LinkedList head, LinkedList body, int lineno) { * @param gurad ガードのリスト * @param body ボディのリスト */ - public SrcRule(String name, LinkedList head, LinkedList guard, LinkedList body) { + public SrcRule( + String name, + LinkedList head, + LinkedList guard, + LinkedList body) { this.name = name; this.head = head; this.guard = guard; - this.guardNegatives = new LinkedList(); + this.guardNegatives = new LinkedList<>(); this.body = body; addHyperLinkConstraint(head, this.guard, body); } @@ -72,7 +78,12 @@ public SrcRule(String name, LinkedList head, LinkedList guard, LinkedList body) * @param body ボディのリスト * @param lineno 行番号 */ - public SrcRule(String name, LinkedList head, LinkedList guard, LinkedList body, int lineno) { + public SrcRule( + String name, + LinkedList head, + LinkedList guard, + LinkedList body, + int lineno) { this(name, head, guard, body); this.lineno = lineno; } @@ -88,17 +99,22 @@ public SrcRule(String name, LinkedList head, LinkedList guard, LinkedList body, * @param lineno 行番号 */ public SrcRule( - String name, LinkedList head, List head2, LinkedList guard, LinkedList body, int lineno) { + String name, + LinkedList head, + LinkedList head2, + LinkedList guard, + LinkedList body, + int lineno) { this.name = name; this.head = head; - this.guard = (guard == null ? new LinkedList() : guard); - this.guardNegatives = new LinkedList(); + this.guard = (guard == null ? new LinkedList<>() : guard); + this.guardNegatives = new LinkedList<>(); this.body = body; if (head2 != null) { unSimpagationize(head2); } - LinkedList head3 = this.head; - LinkedList body2 = this.body; + LinkedList head3 = this.head; + LinkedList body2 = this.body; addTypeConstraint(head3); addHyperLinkConstraint(head3, this.guard, body2); } @@ -113,18 +129,22 @@ public SrcRule( * a(!H:1,!H:2,!H:3) も同じになってしまうのは要改良. * ueda */ - public void addHyperLinkConstraint(LinkedList head, LinkedList guard, LinkedList body) { - LinkedList headhl = new LinkedList(); + public void addHyperLinkConstraint( + LinkedList head, LinkedList guard, LinkedList body) { + LinkedList headhl = new LinkedList<>(); addHyperLinkConstraintSub(head, guard, body, headhl); } - private LinkedList addHyperLinkConstraintSub( - LinkedList head, LinkedList guard, LinkedList body, LinkedList headhl) { + private LinkedList addHyperLinkConstraintSub( + LinkedList head, + LinkedList guard, + LinkedList body, + LinkedList headhl) { if (head != null) { for (Object o : head) { if (o instanceof SrcHyperLink) { SrcHyperLink shl = (SrcHyperLink) o; - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); SrcLink name = new SrcLink(shl.name); SrcAtom attr = new SrcAtom(shl.attr); newl.add(name); @@ -151,7 +171,7 @@ private LinkedList addHyperLinkConstraintSub( SrcLink name = new SrcLink(shl.name); SrcAtom attr = new SrcAtom(shl.attr); if (!headhl.contains(name.toString())) { - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); newl.add(name); if (!attr.getName().equals("")) { newl.add(attr); @@ -176,31 +196,31 @@ private LinkedList addHyperLinkConstraintSub( * リンク名が_IXなど、頭に_Iがつくと自動でガードにint(_IX)を加える. * hara. nakano. * */ - public void addTypeConstraint(LinkedList l) { + public void addTypeConstraint(LinkedList l) { if (l == null) { return; } - for (Object o : l) { + for (SrcElement o : l) { if (o instanceof SrcLink) { SrcLink sl = (SrcLink) o; if (sl.name.matches("^_I.*")) { // int - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); newl.add(new SrcLink(sl.name)); SrcAtom newg = new SrcAtom("int", newl); guard.add(newg); } else if (sl.name.matches("^_G.*")) { // ground - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); newl.add(new SrcLink(sl.name)); SrcAtom newg = new SrcAtom("ground", newl); guard.add(newg); } else if (sl.name.matches("^_S.*")) { // string - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); newl.add(new SrcLink(sl.name)); SrcAtom newg = new SrcAtom("string", newl); guard.add(newg); } else if (sl.name.matches("^_U.*")) { // unary - LinkedList newl = new LinkedList(); + LinkedList newl = new LinkedList<>(); newl.add(new SrcLink(sl.name)); SrcAtom newg = new SrcAtom("unary", newl); guard.add(newg); @@ -220,7 +240,7 @@ public void addTypeConstraint(LinkedList l) { * simpagation rule を、通常のルールの形に直す。コンストラクタから呼ばれる。 * @param head2 ヘッドの'\'の後ろ部分のリスト */ - private void unSimpagationize(List head2) { + private void unSimpagationize(LinkedList head2) { // head を全てbodyへコピー (前に追加のほうが再利用の上でも都合がいい?) body.addAll(copySrcs(head)); // head2をheadの後ろに連結 @@ -232,16 +252,16 @@ private void unSimpagationize(List head2) { * @param l * @return */ - private LinkedList copySrcs(List l) { + private LinkedList copySrcs(LinkedList l) { if (l == null) { return null; } - LinkedList ret = new LinkedList(); // List 型だと各所で使っているgetFirstが無い + LinkedList ret = new LinkedList<>(); // List 型だと各所で使っているgetFirstが無い for (Object o : l) { if (o instanceof SrcAtom) { SrcAtom sa = (SrcAtom) o; - ret.add(new SrcAtom(sa.getSrcName(), copySrcs(sa.getProcess()))); + ret.add(new SrcAtom(sa.getName(), copySrcs(sa.getProcess()))); } else if (o instanceof SrcMembrane) { SrcMembrane sm = (SrcMembrane) o; SrcMembrane cpm = new SrcMembrane(copySrcs(sm.getProcess())); @@ -270,7 +290,7 @@ private LinkedList copySrcs(List l) { /** * ヘッドを設定する */ - public void setHead(LinkedList head) { + public void setHead(LinkedList head) { this.head = head; } @@ -278,7 +298,7 @@ public void setHead(LinkedList head) { * ルールのヘッドを取得します * @return ヘッドのリスト */ - public LinkedList getHead() { + public LinkedList getHead() { return head; } @@ -286,14 +306,14 @@ public LinkedList getHead() { * ルールのガードを得ます * @return ガードのリスト */ - public LinkedList getGuard() { + public LinkedList getGuard() { return guard; } /** * ガード否定条件を取得する */ - public LinkedList getGuardNegatives() { + public LinkedList>> getGuardNegatives() { return guardNegatives; } @@ -301,7 +321,7 @@ public LinkedList getGuardNegatives() { * ルールのボディを取得します * @return ボディのリスト */ - public LinkedList getBody() { + public LinkedList getBody() { return body; } diff --git a/src/compile/parser/SrcTypeDef.java b/src/compile/parser/SrcTypeDef.java index a26dd735..5b5321b8 100644 --- a/src/compile/parser/SrcTypeDef.java +++ b/src/compile/parser/SrcTypeDef.java @@ -5,17 +5,18 @@ /** * ソース中の型定義を表します */ -class SrcTypeDef { +class SrcTypeDef extends SrcElement { // public SrcName srcname; // 型名 // public LinkedList links; // 引数のリンクリスト public SrcAtom typeName; // 型名と引数のリンクリスト - public LinkedList rules; // 型の内容 + public LinkedList rules; // 型の内容 public int lineno; // 行番号 private String text; // typedef 構文のテキスト表現 - public SrcTypeDef(SrcName name, LinkedList links, LinkedList processlist, int lineno) { + public SrcTypeDef( + SrcName name, LinkedList links, LinkedList processlist, int lineno) { this.typeName = new SrcAtom(name, links); this.rules = processlist; this.lineno = lineno; @@ -25,7 +26,7 @@ public void setTypeAtom(SrcAtom typeName) { this.typeName = typeName; } - public void setRules(LinkedList rule) { + public void setRules(LinkedList rule) { this.rules = rule; } @@ -33,7 +34,7 @@ public SrcAtom getTypeAtom() { return typeName; } - public LinkedList getRules() { + public LinkedList getRules() { return rules; } diff --git a/src/compile/parser/lmntal.cup b/src/compile/parser/lmntal.cup index dc82ae48..82060fd1 100644 --- a/src/compile/parser/lmntal.cup +++ b/src/compile/parser/lmntal.cup @@ -44,21 +44,21 @@ terminal String HL;//seiji terminal String LINK_NAME, NUMBER_NAME, SYMBOL_NAME, ATOM_NAME, PATHED_ATOM_NAME; terminal String CHAR_CODE_LITERAL; -non terminal SrcLink Link; -non terminal SrcHyperLink HyperLink; -non terminal SrcName FuncName; -non terminal String AtomName; -non terminal String RuleName; -non terminal Object QuotedOperatorAtom; -non terminal Object UnitAtom; -non terminal Object UnaryOpAtom; -non terminal Object Atom200; -non terminal Object Atom300; -non terminal Object Atom400; -non terminal Object Atom500; -non terminal Object Atom700; -non terminal Object Atom800; -non terminal Object Atom; +non terminal SrcLink Link; +non terminal SrcHyperLink HyperLink; +non terminal SrcName FuncName; +non terminal String AtomName; +non terminal String RuleName; +non terminal SrcAtom QuotedOperatorAtom; +non terminal SrcElement UnitAtom; +non terminal SrcElement UnaryOpAtom; +non terminal SrcElement Atom200; +non terminal SrcElement Atom300; +non terminal SrcElement Atom400; +non terminal SrcElement Atom500; +non terminal SrcElement Atom700; +non terminal SrcElement Atom800; +non terminal SrcElement Atom; // 現状: (a,b)と(a,b:-c)で衝突するため、項内でのAtomListの採用が保留となっている。 // non terminal Object AtomList; @@ -70,17 +70,17 @@ non terminal SrcRule Rule; non terminal SrcProcessContext ProcessContext; non terminal SrcRuleContext RuleContext; non terminal SrcContext Context; -non terminal Object Process; +non terminal SrcElement Process; non terminal SrcRule ProcessListContinuation; -non terminal LinkedList ProcessList; -non terminal LinkedList NonemptyProcessList; -non terminal LinkedList WorldProcessList; -non terminal LinkedList NonemptyWorldProcessList; +non terminal LinkedList ProcessList; +non terminal LinkedList NonemptyProcessList; +non terminal LinkedList WorldProcessList; +non terminal LinkedList NonemptyWorldProcessList; non terminal SrcAtom List; -non terminal Object ListCdr; -non terminal LinkedList BundleList; -non terminal LinkedList LinkList; -non terminal LinkedList NonemptyLinkList; +non terminal SrcElement ListCdr; +non terminal LinkedList BundleList; +non terminal LinkedList LinkList; +non terminal LinkedList NonemptyLinkList; non terminal SrcLinkBundle Bundle; non terminal SrcAtom Aggregate; non terminal SrcTypeDef TypeDef; @@ -165,7 +165,7 @@ UnitAtom ::= RESULT = list.getFirst(); } else { - RESULT = list; + RESULT = new SrcList(list); } } else { @@ -179,7 +179,7 @@ UnitAtom ::= RESULT = list.getFirst(); } else { - RESULT = list; + RESULT = new SrcList(list); } } else { diff --git a/src/compile/structure/ProcessContext.java b/src/compile/structure/ProcessContext.java index 4d6be223..0c8f1b09 100644 --- a/src/compile/structure/ProcessContext.java +++ b/src/compile/structure/ProcessContext.java @@ -16,7 +16,7 @@ public final class ProcessContext extends Context { /** * 分離した同名型付きプロセス文脈の名前を格納 */ - public LinkedList sameNameList = null; // seiji + public LinkedList sameNameList = null; // seiji /** * リンク名 @@ -56,7 +56,7 @@ public String toString() { /** * 同名プロセス文脈の分離により新たに生成された名前を格納しているリストを返す */ - public LinkedList getSameNameList() { // seiji + public LinkedList getSameNameList() { // seiji return sameNameList; } diff --git a/src/compile/structure/RuleStructure.java b/src/compile/structure/RuleStructure.java index d7b5a5e1..7fd1eddb 100644 --- a/src/compile/structure/RuleStructure.java +++ b/src/compile/structure/RuleStructure.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.HashMap; import java.util.LinkedList; -import java.util.List; import java.util.Map; /** @@ -53,7 +52,7 @@ public final class RuleStructure { /** * ガード否定条件(ProcessContextEquationのLinkedList)のリスト */ - public List> guardNegatives = new LinkedList<>(); + public LinkedList> guardNegatives = new LinkedList<>(); /** * プロセス文脈の限定名 ("$p"などのString) {@literal -->} 文脈の定義 (ContextDef) diff --git a/src/runtime/AtomSet.java b/src/runtime/AtomSet.java index 51c0f519..953fc6f8 100644 --- a/src/runtime/AtomSet.java +++ b/src/runtime/AtomSet.java @@ -96,7 +96,7 @@ public Iterator iteratorOfFunctor(Functor f) { if (!Env.fMemory || f.isSymbol() || f instanceof SpecialFunctor) { List l = (f.isOutsideProxy() ? getOuts().get(f) : getAtoms().get(f)); if (l == null) { - return Util.NULL_ITERATOR; + return Util.null_iterator(); } else { return l.iterator(); } diff --git a/src/util/MultiMapIterator.java b/src/util/MultiMapIterator.java index d33872e7..826262cc 100644 --- a/src/util/MultiMapIterator.java +++ b/src/util/MultiMapIterator.java @@ -30,7 +30,7 @@ private void setNext() { /** 指定されたMap内にあるデータを列挙する反復子を生成する */ public MultiMapIterator(Map> map) { setIterator = map.values().iterator(); - dataIterator = Util.NULL_ITERATOR; + dataIterator = Util.null_iterator(); setNext(); } diff --git a/src/util/Util.java b/src/util/Util.java index f263a8fd..15175e22 100644 --- a/src/util/Util.java +++ b/src/util/Util.java @@ -21,7 +21,10 @@ public abstract class Util { public static Functor DOT = new SymbolFunctor(".", 3); public static Functor NIL = new SymbolFunctor("[]", 1); - public static final Iterator NULL_ITERATOR = Collections.EMPTY_SET.iterator(); + + public static Iterator null_iterator() { + return Collections.emptyIterator(); + } private Util() {} diff --git a/tools/JFlex.jar b/tools/JFlex.jar index 637f0128..4bde8ee6 100644 Binary files a/tools/JFlex.jar and b/tools/JFlex.jar differ