This is an automated email from the ASF dual-hosted git repository.

slawrence pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/daffodil.git


The following commit(s) were added to refs/heads/master by this push:
     new 45b26a2  [DAFFODIL-1437] : DFA Rules - eliminate anonymous classes and 
functions
45b26a2 is described below

commit 45b26a254d627e24bde07ac88a1c75b514de2600
Author: Sandeep Kumar <[email protected]>
AuthorDate: Thu May 13 14:35:44 2021 +0530

    [DAFFODIL-1437] : DFA Rules - eliminate anonymous classes and functions
---
 .../org/apache/daffodil/processors/dfa/Rules.scala | 491 +++++++++++----------
 .../apache/daffodil/processors/dfa/Runtime.scala   |  18 -
 2 files changed, 263 insertions(+), 246 deletions(-)

diff --git 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Rules.scala
 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Rules.scala
index 561dfae..7c511de 100644
--- 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Rules.scala
+++ 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Rules.scala
@@ -66,6 +66,7 @@ abstract class State(states: => ArrayBuffer[State]) extends 
Serializable {
   def findState(name: String): Int = {
     states.find(st => st.stateName == name).get.stateNum
   }
+
   // this is just one way to plumb the things together.
   // it depends on every state having a unique name
   //
@@ -75,6 +76,7 @@ abstract class State(states: => ArrayBuffer[State]) extends 
Serializable {
   lazy val PTERMState = findState("PTERM0")
 
   def printStr(): String = states.mkString
+
   override def toString(): String = stateName + "_" + stateNum
 
   def couldBeFirstChar(charIn: Char, delimIter: DelimiterIterator): Boolean = {
@@ -104,7 +106,10 @@ abstract class State(states: => ArrayBuffer[State]) 
extends Serializable {
     val res =
       if (pTerm0.isInstanceOf[WSPStarState]) {
         val wspStar = pTerm0.asInstanceOf[WSPStarState]
-        if (wspStar.checkMatch(charIn)) { true } // Was a space
+        if (wspStar.checkMatch(charIn)) {
+          // Was a space
+          true
+        }
         else if (wspStar.nextState == DFA.FinalState) {
           // WSP* is not allowed to appear by itself as a terminator
           // or separator.
@@ -123,6 +128,37 @@ abstract class State(states: => ArrayBuffer[State]) 
extends Serializable {
       }
     res
   }
+
+  object PauseRule extends Rule {
+    override def test(r: Registers): Boolean = couldBeFirstChar(r.data0, 
r.delimitersIter)
+
+    override def act(r: Registers): Unit = r.status = StateKind.Paused
+  }
+
+  object EndOfDataCharRule extends Rule {
+    override def test(r: Registers): Boolean = r.data0 == DFA.EndOfDataChar
+
+    override def act(r: Registers): Unit = r.nextState = DFA.EndOfData
+  }
+
+  object LookAheadEndOfDataCharRule extends Rule {
+    override def test(r: Registers): Boolean = r.data1 == DFA.EndOfDataChar
+
+    override def act(r: Registers): Unit = {
+      r.appendToField(r.data0)
+      r.nextState = DFA.EndOfData
+    }
+  }
+
+  object StartStateRule extends Rule {
+    override def test(r: Registers): Boolean = true
+
+    override def act(r: Registers): Unit = {
+      r.appendToField(r.data0)
+      r.advance()
+      r.nextState = StartState
+    }
+  }
 }
 
 // The delimiter compiler still has to select and instantiate all the 
appropriate states
@@ -148,18 +184,19 @@ class StartStateUnambiguousEscapeChar(states: => 
ArrayBuffer[State], EEC: MaybeC
 
   val stateName: String = "StartState"
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { EEC.isDefined && EC.isDefined && r.data0 == 
EEC.get } } { (r: Registers) => r.nextState = EECState },
-    Rule { (r: Registers) => EC.isDefined && r.data0 == EC.get } { (r: 
Registers) => r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => r.nextState = DFA.EndOfData },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance()
-        r.nextState = StartState
-      }
-    })
+    PauseRule,
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && EC.isDefined 
&& r.data0 == EEC.get
+
+      override def act(r: Registers): Unit = r.nextState = EECState
+    },
+    new Rule {
+      override def test(r: Registers): Boolean = EC.isDefined && r.data0 == 
EC.get
 
+      override def act(r: Registers): Unit = r.nextState = ECState
+    },
+    EndOfDataCharRule,
+    StartStateRule)
 }
 
 class StartState(states: => ArrayBuffer[State], val stateNum: Int)
@@ -167,26 +204,9 @@ class StartState(states: => ArrayBuffer[State], val 
stateNum: Int)
 
   val stateName: String = "StartState"
   val rules = ArrayBuffer(
-    Rule { (r: Registers) =>
-      couldBeFirstChar(r.data0, r.delimitersIter)
-    } { (r: Registers) =>
-      r.status = StateKind.Paused
-    },
-    Rule { (r: Registers) =>
-      {
-        r.data0 == DFA.EndOfDataChar
-      }
-    } { (r: Registers) =>
-      r.nextState = DFA.EndOfData
-    },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance()
-        r.nextState = StartState
-      }
-    })
-
+    PauseRule,
+    EndOfDataCharRule,
+    StartStateRule)
 }
 
 class StartStatePadding(states: => ArrayBuffer[State], val padChar: Char)
@@ -195,14 +215,20 @@ class StartStatePadding(states: => ArrayBuffer[State], 
val padChar: Char)
   val stateName = "StartState"
   val stateNum: Int = 0
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => { r.data0 == padChar } } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = r.data0 == padChar
+
+      override def act(r: Registers): Unit = {
         r.appendToField(r.data0)
         r.advance()
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => true } { (r: Registers) => { r.nextState = 
DFA.FinalState } })
+    new Rule {
+      override def test(r: Registers): Boolean = true
+
+      override def act(r: Registers): Unit = r.nextState = DFA.FinalState
+    })
 }
 
 /**
@@ -214,8 +240,10 @@ class StartStateEscapeBlock(states: => ArrayBuffer[State], 
val blockEnd: DFADeli
   val stateName: String = "StartState"
 
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, blockEnd)} { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = couldBeFirstChar(r.data0, 
blockEnd)
+
+      override def act(r: Registers): Unit = {
         if (EEC.isDefined && (blockEnd.lookingFor.equals(EEC.get.toString))) { 
// EEC == escapeBlockEnd
           r.nextState = EECState
         } else {
@@ -223,15 +251,13 @@ class StartStateEscapeBlock(states: => 
ArrayBuffer[State], val blockEnd: DFADeli
         }
       }
     },
-    Rule { (r: Registers) => { EEC.isDefined && (r.data0 == EEC.get) } } { (r: 
Registers) => { r.nextState = EECState }},
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => { r.nextState = DFA.EndOfData }},
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && (r.data0 == 
EEC.get)
+
+      override def act(r: Registers): Unit = r.nextState = EECState
+    },
+    EndOfDataCharRule,
+    StartStateRule)
 }
 
 class StartStateEscapeChar(states: => ArrayBuffer[State], val EEC: MaybeChar, 
val EC: Char, val stateNum: Int)
@@ -239,108 +265,102 @@ class StartStateEscapeChar(states: => 
ArrayBuffer[State], val EEC: MaybeChar, va
 
   val stateName: String = "StartState"
 
+  object NextStateECRule extends Rule {
+    override def test(r: Registers): Boolean = r.data0 == EC
+
+    override def act(r: Registers): Unit = r.nextState = ECState
+  }
+
+  object NextStateEECRule extends Rule {
+    override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get && r.data1 == EC
+
+    override def act(r: Registers): Unit = r.nextState = EECState
+  }
+
   val rules_NO_EEC_BUT_EC_TERM_SAME = ArrayBuffer(
-    Rule { (r: Registers) => (r.data0 == EC) && couldBeFirstChar(r.data1, 
r.delimitersIter) } { (r: Registers) => r.nextState = ECState },
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { r.data0 == EC } } { (r: Registers) => 
r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => { r.nextState = DFA.EndOfData } },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    new Rule {
+      override def test(r: Registers): Boolean = (r.data0 == EC) && 
couldBeFirstChar(r.data1, r.delimitersIter)
+
+      override def act(r: Registers): Unit = r.nextState = ECState
+    },
+    PauseRule,
+    NextStateECRule,
+    EndOfDataCharRule,
+    StartStateRule)
 
   val rules_EEC_EC_SAME_NOT_TERM = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
== EC } } { (r: Registers) => r.nextState = EECState },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
!= EC } } { (r: Registers) => r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => r.nextState = DFA.EndOfData },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    PauseRule,
+    NextStateEECRule,
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get && r.data1 != EC
+
+      override def act(r: Registers): Unit = r.nextState = ECState
+    },
+    EndOfDataCharRule,
+    StartStateRule)
 
   val rules_EEC_TERM_SAME_NOT_EC = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => { r.status = StateKind.Paused } },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
== EC } } { (r: Registers) => r.nextState = EECState },
-    Rule { (r: Registers) => { r.data0 == EC } } { (r: Registers) => 
r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => r.nextState = DFA.EndOfData },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    PauseRule,
+    NextStateEECRule,
+    NextStateECRule,
+    EndOfDataCharRule,
+    StartStateRule)
 
   val rules_EC_TERM_SAME_NOT_EEC = ArrayBuffer(
-    Rule { (r: Registers) => { r.data0 == EC && r.data1 == EC } } { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = r.data0 == EC && r.data1 == EC
+
+      override def act(r: Registers): Unit = {
         // EC followed by EC, first EC gets dropped
         r.dropChar(r.data0)
         r.appendToField(r.data1)
-        r.advance
-        r.advance
+        r.advance()
+        r.advance()
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
== EC } } { (r: Registers) => r.nextState = EECState },
-    Rule { (r: Registers) => { r.data0 == EC } } { (r: Registers) => 
r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => r.nextState = DFA.EndOfData },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    PauseRule,
+    NextStateEECRule,
+    NextStateECRule,
+    EndOfDataCharRule,
+    StartStateRule)
 
   val rules_EC_EEC_TERM_SAME = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
== EEC.get } } {
-      (r: Registers) => r.nextState = EECState
-    },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
!= DFA.EndOfDataChar } } {
-      (r: Registers) =>
-        {
-          // EEC followed by something not a PTERM[2]
-          r.dropChar(r.data0)
-          r.appendToField(r.data1)
-          r.advance
-          r.advance
-          r.nextState = StartState
-        }
-    },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get && r.data1 
== DFA.EndOfDataChar } } {
-      (r: Registers) => r.nextState = ECState
+    PauseRule,
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get && r.data1 == EEC.get
+
+      override def act(r: Registers): Unit = r.nextState = EECState
     },
-    Rule { (r: Registers) => r.data0 == DFA.EndOfDataChar } { (r: Registers) 
=> { r.nextState = DFA.EndOfData } },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.advance
-        r.nextState = StartState
-      }
-    })
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get && r.data1 != DFA.EndOfDataChar
 
-  val rules_Unambiguous = ArrayBuffer(
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } { 
(r: Registers) => r.status = StateKind.Paused },
-    Rule { (r: Registers) => { EEC.isDefined && r.data0 == EEC.get } } { (r: 
Registers) => r.nextState = EECState },
-    Rule { (r: Registers) => { r.data0 == EC } } { (r: Registers) => 
r.nextState = ECState },
-    Rule { (r: Registers) => { r.data0 == DFA.EndOfDataChar } } { (r: 
Registers) => r.nextState = DFA.EndOfData },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        r.appendToField(r.data0)
+      override def act(r: Registers): Unit = {
+        // EEC followed by something not a PTERM[2]
+        r.dropChar(r.data0)
+        r.appendToField(r.data1)
+        r.advance()
         r.advance()
         r.nextState = StartState
       }
-    })
+    },
+    new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get && r.data1 == DFA.EndOfDataChar
+
+      override def act(r: Registers): Unit = r.nextState = ECState
+    },
+    EndOfDataCharRule,
+    StartStateRule)
+
+  val rules_Unambiguous = ArrayBuffer(
+    PauseRule, new Rule {
+      override def test(r: Registers): Boolean = EEC.isDefined && r.data0 == 
EEC.get
+
+      override def act(r: Registers): Unit = r.nextState = EECState
+    },
+    NextStateECRule,
+    EndOfDataCharRule,
+    StartStateRule)
 
   /**
    * A state executes by evaluating guarded actions.
@@ -403,8 +423,10 @@ class ECState(states: => ArrayBuffer[State], val EC: Char, 
val stateNum: Int)
   val rules = ArrayBuffer(
     // ECState, means that data0 is EC
     //
-    Rule { (r: Registers) => couldBeFirstChar(r.data1, r.delimitersIter) } { 
(r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = couldBeFirstChar(r.data1, 
r.delimitersIter)
+
+      override def act(r: Registers): Unit = {
         // constituent character
         r.dropChar(r.data0)
         r.appendToField(r.data1)
@@ -413,8 +435,10 @@ class ECState(states: => ArrayBuffer[State], val EC: Char, 
val stateNum: Int)
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => { r.data1 == EC } } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = r.data1 == EC
+
+      override def act(r: Registers): Unit = {
         // next char is also EC, drop this EC
         // but do not treat next EC as char
         r.dropChar(r.data0)
@@ -422,14 +446,18 @@ class ECState(states: => ArrayBuffer[State], val EC: 
Char, val stateNum: Int)
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => { r.data1 == DFA.EndOfDataChar } } { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = r.data1 == DFA.EndOfDataChar
+
+      override def act(r: Registers): Unit = {
         r.dropChar(r.data0)
         r.nextState = DFA.EndOfData
       }
     },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = true
+
+      override def act(r: Registers): Unit = {
         // constituent character
         r.dropChar(r.data0)
         r.appendToField(r.data1)
@@ -452,11 +480,11 @@ class EECState(states: => ArrayBuffer[State], val EEC: 
MaybeChar, val EC: Char,
     //
     // We've already encountered EEC as data0 here
     //
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, r.delimitersIter) } {
-      (r: Registers) => r.status = StateKind.Paused //PTERMState
-    },
-    Rule { (r: Registers) => { r.data1 == EC } } { (r: Registers) =>
-      {
+    PauseRule,
+    new Rule {
+      override def test(r: Registers): Boolean = r.data1 == EC
+
+      override def act(r: Registers): Unit = {
         // Drop EEC aka data0
         r.dropChar(r.data0)
         r.appendToField(r.data1)
@@ -465,22 +493,8 @@ class EECState(states: => ArrayBuffer[State], val EEC: 
MaybeChar, val EC: Char,
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => { r.data1 == DFA.EndOfDataChar } } { (r: 
Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.nextState = DFA.EndOfData
-      }
-    },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        // Not followed by an EC, therefore
-        // it is an EEC and should remain in field.
-        //
-        r.appendToField(r.data0)
-        r.advance()
-        r.nextState = StartState
-      }
-    })
+    LookAheadEndOfDataCharRule,
+    StartStateRule)
 }
 
 class EECStateBlock(states: => ArrayBuffer[State], blockEnd: DFADelimiter, val 
EEC: MaybeChar, val stateNum: Int)
@@ -495,47 +509,43 @@ class EECStateBlock(states: => ArrayBuffer[State], 
blockEnd: DFADelimiter, val E
     //
     // We've already encountered EEC as data0 here
     //
-    Rule { (r: Registers) => couldBeFirstChar(r.data0, blockEnd) && 
!couldBeFirstChar(r.data1, blockEnd) } {
-      (r: Registers) => r.status = StateKind.Paused //PTERMState
+    new Rule {
+      override def test(r: Registers): Boolean = couldBeFirstChar(r.data0, 
blockEnd) && !couldBeFirstChar(r.data1, blockEnd)
+
+      override def act(r: Registers): Unit = r.status = StateKind.Paused
     },
-    Rule { (r: Registers) => couldBeFirstChar(r.data1, blockEnd) } { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = couldBeFirstChar(r.data1, 
blockEnd)
+
+      override def act(r: Registers): Unit = {
         // EEC followed by possible blockEnd
         r.dropChar(r.data0)
         r.appendToField(r.data1)
-        r.advance
-        r.advance
+        r.advance()
+        r.advance()
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => { r.data1 == EEC.get } } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = r.data1 == EEC.get
+
+      override def act(r: Registers): Unit = {
         // EEC followed by EEC, stays in field
         r.appendToField(r.data0)
         r.advance()
         r.nextState = StartState
       }
     },
-    Rule { (r: Registers) => { r.data1 == DFA.EndOfDataChar } } { (r: 
Registers) =>
-      {
-        r.appendToField(r.data0)
-        r.nextState = DFA.EndOfData
-      }
-    },
-    Rule { (r: Registers) => true } { (r: Registers) =>
-      {
-        // EEC followed by normal character
-        r.appendToField(r.data0)
-        r.advance()
-        r.nextState = StartState
-      }
-    })
+    LookAheadEndOfDataCharRule,
+    StartStateRule)
 }
 
 abstract class DelimStateBase(states: => ArrayBuffer[State])
   extends State(states) {
   var stateName: String = null
+
   def setStateName(name: String) = stateName = name
+
   def rules: ArrayBuffer[Rule]
 
   def nextState: Int
@@ -552,23 +562,23 @@ class CharState(states: => ArrayBuffer[State], char: 
Char, val nextState: Int, v
 
   stateName = "CharState(" + char + ")"
   val rulesToThisState = ArrayBuffer(
-    Rule { (r: Registers) =>
-      {
-        checkMatch(r.data0)
-      }
-    } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = stateNum
       }
     })
 
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => { checkMatch(r.data0) } } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = nextState
       }
     })
@@ -609,19 +619,23 @@ class WSPState(states: => ArrayBuffer[State], val 
nextState: Int, val stateNum:
 
   stateName = "WSPState"
   val rulesToThisState = ArrayBuffer(
-    Rule { (r: Registers) => checkMatch(r.data0) } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = stateNum
       }
     })
 
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => checkMatch(r.data0) } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = nextState
       }
     })
@@ -637,26 +651,32 @@ class WSPPlusState(states: => ArrayBuffer[State], val 
nextState: Int, val stateN
 
   stateName = "WSPPlusState"
   val rulesToThisState = ArrayBuffer(
-    Rule { (r: Registers) => checkMatch(r.data0) } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = stateNum // This state
       }
     })
+  val rules = ArrayBuffer(new Rule {
+    override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+    override def act(r: Registers): Unit = {
+      r.appendToDelim(r.data0)
+      r.advance()
+      r.matchedAtLeastOnce = true
+      r.nextState = stateNum // This state
+    }
+  },
+    new Rule {
+      override def test(r: Registers): Boolean = r.matchedAtLeastOnce
 
-  val rules = ArrayBuffer(
-    Rule { (r: Registers) => checkMatch(r.data0) } { (r: Registers) =>
-      {
-        r.appendToDelim(r.data0)
-        r.advance
-        r.matchedAtLeastOnce = true
-        r.nextState = stateNum // This state
+      override def act(r: Registers): Unit = {
+        r.matchedAtLeastOnce = false
+        r.nextState = nextState
       }
-    },
-    Rule { (r: Registers) => r.matchedAtLeastOnce } { (r: Registers) =>
-      r.matchedAtLeastOnce = false
-      r.nextState = nextState
     })
 }
 
@@ -666,15 +686,19 @@ class WSPStarState(states: => ArrayBuffer[State], val 
nextState: Int, val stateN
   stateName = "WSPStarState"
 
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => checkMatch(r.data0) } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = checkMatch(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = stateNum // This state
       }
     },
-    Rule { (r: Registers) => true } {
-      (r: Registers) => r.nextState = nextState
+    new Rule {
+      override def test(r: Registers): Boolean = true
+
+      override def act(r: Registers): Unit = r.nextState = nextState
     })
 }
 
@@ -709,26 +733,36 @@ class NLState(states: => ArrayBuffer[State], val 
nextState: Int, val stateNum: I
   stateName = "NLState"
 
   val rules = ArrayBuffer(
-    Rule { (r: Registers) => { isCR(r.data0) && isLF(r.data1) } } { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = {
+        isCR(r.data0) && isLF(r.data1)
+      }
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
         r.appendToDelim(r.data1)
-        r.advance
-        r.advance
+        r.advance()
+        r.advance()
         r.nextState = nextState
       }
     },
-    Rule { (r: Registers) => { isCR(r.data0) && !isLF(r.data1) } } { (r: 
Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = {
+        isCR(r.data0) && !isLF(r.data1)
+      }
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = nextState
       }
     },
-    Rule { (r: Registers) => isNLNotCR(r.data0) } { (r: Registers) =>
-      {
+    new Rule {
+      override def test(r: Registers): Boolean = isNLNotCR(r.data0)
+
+      override def act(r: Registers): Unit = {
         r.appendToDelim(r.data0)
-        r.advance
+        r.advance()
         r.nextState = nextState
       }
     })
@@ -748,11 +782,12 @@ class ESState(states: => ArrayBuffer[State], val 
nextState: Int, val stateNum: I
    * immediately match while consuming no characters.
    */
   lazy val rules = ArrayBuffer(
-    Rule { (r: Registers) => { true } } { (r: Registers) =>
-      {
-        r.status = StateKind.Succeeded
-      }
+    new Rule {
+      override def test(r: Registers): Boolean = true
+
+      override def act(r: Registers): Unit = r.status = StateKind.Succeeded
     }
   )
+
   def checkMatch(charIn: Char): Boolean = Assert.impossible("We should never 
ask if a character matches an %ES;")
 }
diff --git 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Runtime.scala
 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Runtime.scala
index dcb1500..ff22462 100644
--- 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Runtime.scala
+++ 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/dfa/Runtime.scala
@@ -160,21 +160,3 @@ trait Rule extends Serializable {
   def test(r: Registers): Boolean // take this action?
   def act(r: Registers): Unit // modifies the registers
 }
-
-/**
- * Convenient thingy for hand-created rules
- * <p>
- * Can write things like `Rule { r.data0 == EC } { 
r.resultString.append(...)...}
- * Examples in other file.
- *
- * TODO: Get rid of all the anonymous Rule objects. No reason these can't be 
ordinary
- * classes with test and act methods.
- */
-object Rule {
-  def apply(testBody: Registers => Boolean)(actionBody: Registers => Unit) = {
-    new Rule {
-      override def test(r: Registers) = testBody(r)
-      override def act(r: Registers) = actionBody(r)
-    }
-  }
-}

Reply via email to