summaryrefslogtreecommitdiff
path: root/javascripts/NfaSimulator.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascripts/NfaSimulator.js')
-rw-r--r--javascripts/NfaSimulator.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/javascripts/NfaSimulator.js b/javascripts/NfaSimulator.js
new file mode 100644
index 0000000..fd5677e
--- /dev/null
+++ b/javascripts/NfaSimulator.js
@@ -0,0 +1,77 @@
+/*
+ * NfaSimulator
+ *
+ */
+function NfaSimulator(nfa) {
+ this.q = new Queue;
+ this.p = new Queue;
+ this.startState = nfa.getStartState();
+ this.acceptingState = nfa.getAcceptingState();
+}
+
+NfaSimulator.prototype.getStartState = function() {
+ return this.startState;
+}
+
+NfaSimulator.prototype.getAcceptingState = function() {
+ return this.acceptingState;
+}
+
+NfaSimulator.prototype.run = function(word) {
+ this.word = word;
+ this.str = '';
+ this.accepted = false;
+
+ this.getStartState().mark(true);
+ this.q.push(this.getStartState());
+
+ this.str += '$';
+
+ for (var i = 0; i < word.length; i++) {
+ this.accepted = this.epsclosure();
+ this.str = this.word.substring(i, i+1);
+ this.move(this.str);
+ }
+
+ return accepted;
+}
+
+
+NfaSimulator.prototype.epsclosure = function() {
+ var s, t;
+ accepted = false;
+
+ while(!this.q.empty()) {
+ s = this.q.pop();
+ this.p.push(s);
+ accepted = accepted || s == this.getAcceptingState();
+
+ if(s.symbol == '&') {
+ for (var i = 0; i < 2; i++) {
+ t = s.getFollowUp(i);
+ if (t!=null) {
+ if(!t.marked) {
+ t.mark(true);
+ this.q.push(t);
+ }
+ }
+ }
+ }
+ }
+ return accepted;
+}
+
+
+NfaSimulator.prototype.move = function(str) {
+ var s;
+
+ while(!this.p.empty()) {
+ s = this.q.pop();
+ s.mark(false);
+ if (s.symbol == str) {
+ s.getFollowUp(0).mark(true);
+ this.q.push(s.getFollowUp(0));
+ }
+ }
+}
+