branch: externals/parser-generator
commit c299371a7453b208a123851cfa75047ede68bbc8
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>

    Started work on refactoring lex-analyzer into a state-based lex-analyzer
---
 TODO.md                                    |   2 +
 parser-generator-lex-analyzer.el           | 107 +++++++++++++++++++----------
 test/parser-generator-lex-analyzer-test.el |  19 +++--
 3 files changed, 85 insertions(+), 43 deletions(-)

diff --git a/TODO.md b/TODO.md
index 952c7d226e..12403ad50f 100644
--- a/TODO.md
+++ b/TODO.md
@@ -8,6 +8,8 @@ Functions (with validations) to set global variables:
 * parser-generator--global-attributes
 * parser-generator--global-declaration
 
+State-based lex-analyzer
+
 ## LR-Parser
 
 Functions (with validations) to set global variables:
diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el
index 5422cc7e36..9f1ff4f4c7 100644
--- a/parser-generator-lex-analyzer.el
+++ b/parser-generator-lex-analyzer.el
@@ -31,14 +31,24 @@
   "Index in lex-analyzer.")
 
 (defvar
-  parser-generator-lex-analyzer--reset-function
-  nil
-  "Function used when resetting lex-analyzer.")
+  parser-generation-lex-analyzer--index-init
+  1
+  "Initial value of index.")
 
 (defvar-local
-  parser-generator-lex-analyzer--move-to-index-flag
+  parser-generation-lex-analyzer--state
+  nil
+  "State of lex-analyzer.")
+
+(defvar
+  parser-generator-lex-analyzer--state-init
   nil
-  "Non-nil means move index to value.")
+  "Initial value of state.")
+
+(defvar
+  parser-generator-lex-analyzer--reset-function
+  nil
+  "Function used when resetting lex-analyzer.")
 
 
 ;; Functions
@@ -55,10 +65,11 @@
   (let ((meta-information))
     (condition-case error
         (progn
-          (setq meta-information
-                (funcall
-                 parser-generator-lex-analyzer--get-function
-                 token)))
+          (setq
+           meta-information
+           (funcall
+            parser-generator-lex-analyzer--get-function
+            token)))
       (error
        (signal
         'error
@@ -88,6 +99,7 @@
   (let ((look-ahead)
         (look-ahead-length 0)
         (index parser-generator-lex-analyzer--index)
+        (state parser-generation-lex-analyzer--state)
         (k (max
             1
             parser-generator--look-ahead-number)))
@@ -96,22 +108,30 @@
             k)
       (condition-case error
           (progn
-            (setq-local
-             parser-generator-lex-analyzer--move-to-index-flag
-             nil)
-            (let ((next-look-ahead
+            (let* ((result-list
                    (funcall
                     parser-generator-lex-analyzer--function
-                    index)))
-              (if parser-generator-lex-analyzer--move-to-index-flag
-                  (setq
-                   index
-                   parser-generator-lex-analyzer--move-to-index-flag)
-                (if next-look-ahead
+                    index
+                    state))
+                   (token
+                    (nth 0 result-list))
+                   (move-to-index-flag
+                    (nth 1 result-list))
+                   (new-state
+                    (nth 3 result-list)))
+              (if move-to-index-flag
+                  (progn
+                    (setq
+                     index
+                     move-to-index-flag)
+                    (setq
+                     state
+                     new-state))
+                (if token
                     (progn
-                      (unless (listp (car next-look-ahead))
-                        (setq next-look-ahead (list next-look-ahead)))
-                      (dolist (next-look-ahead-item next-look-ahead)
+                      (unless (listp (car token))
+                        (setq token (list token)))
+                      (dolist (next-look-ahead-item token)
                         (when (<
                                look-ahead-length
                                k)
@@ -141,25 +161,34 @@
     (while continue
       (condition-case error
           (progn
-            (setq-local
-             parser-generator-lex-analyzer--move-to-index-flag
-             nil)
-            (let ((token
-                   (funcall
-                    parser-generator-lex-analyzer--function
-                    parser-generator-lex-analyzer--index)))
-              (if parser-generator-lex-analyzer--move-to-index-flag
+            (let* ((result-list
+                    (funcall
+                     parser-generator-lex-analyzer--function
+                     parser-generator-lex-analyzer--index
+                     parser-generator-lex-analyzer--state))
+                   (token
+                    (nth 0 result-list))
+                   (move-to-index-flag
+                    (nth 1 result-list))
+                   (new-index
+                    (nth 2 result-list))
+                   (new-state
+                    (nth 3 result-list)))
+              (if move-to-index-flag
                   (progn
                     (setq-local
                      parser-generator-lex-analyzer--index
-                     parser-generator-lex-analyzer--move-to-index-flag))
+                     move-to-index-flag)
+                    (setq-local
+                     parser-generator-lex-analyzer--state
+                     new-state))
+                (setq
+                 parser-generator-lex-analyzer--index
+                 new-index)
                 (when token
                   (unless (listp (car token))
                     (setq token (list token)))
                   (let ((first-token (car token)))
-                    (setq
-                     parser-generator-lex-analyzer--index
-                     (cdr (cdr first-token)))
                     (push
                      first-token
                      tokens)))
@@ -168,14 +197,20 @@
                  nil))))
         (error
          (error
-          "Lex-analyze failed to pop token at %s, error: %s"
+          "Lex-analyze failed to pop token at %s %s, error: %s"
           parser-generator-lex-analyzer--index
+          parser-generator-lex-analyzer--state
           (car (cdr error))))))
     (nreverse tokens)))
 
 (defun parser-generator-lex-analyzer--reset ()
   "Reset lex-analyzer."
-  (setq parser-generator-lex-analyzer--index 1)
+  (setq
+   parser-generator-lex-analyzer--index
+   parser-generation-lex-analyzer--index-init)
+  (setq
+   parser-generator-lex-analyzer--state
+   parser-generator-lex-analyzer--state-init)
   (when parser-generator-lex-analyzer--reset-function
     (funcall parser-generator-lex-analyzer--reset-function)))
 
diff --git a/test/parser-generator-lex-analyzer-test.el 
b/test/parser-generator-lex-analyzer-test.el
index 2bbeb0dad1..a0c85eaff4 100644
--- a/test/parser-generator-lex-analyzer-test.el
+++ b/test/parser-generator-lex-analyzer-test.el
@@ -24,7 +24,7 @@
    (parser-generator-lex-analyzer--peek-next-look-ahead))
   (setq
    parser-generator-lex-analyzer--function
-   (lambda (index)
+   (lambda (index _state)
      (let* ((string '(("a" 1 . 2) ("b" 2 . 3) ("c" 3 . 4) ("d" 4 . 5)))
             (string-length (length string))
             (max-index index)
@@ -36,7 +36,7 @@
          (setq next-token (nth (1- index) string))
          (push next-token tokens)
          (setq index (1+ index)))
-       (nreverse tokens))))
+       (list (nreverse tokens) nil nil nil))))
   (should-error
    (parser-generator-lex-analyzer--peek-next-look-ahead))
   (parser-generator-lex-analyzer--reset)
@@ -46,6 +46,7 @@
   (message "Passed failing lex analysis")
 
   (setq parser-generator--look-ahead-number 1)
+  (parser-generator-lex-analyzer--peek-next-look-ahead)
   (should
    (equal
     '(("a" 1 . 2))
@@ -65,7 +66,7 @@
 
   (setq
    parser-generator-lex-analyzer--function
-   (lambda (index)
+   (lambda (index _state)
      (let* ((string '(("a" 1 . 2) ("b" 2 . 3) ("c" 3 . 4) ("d" 4 . 5)))
             (string-length (length string))
             (max-index index)
@@ -79,7 +80,7 @@
            (error "Invalid token: %s" next-token))
          (push next-token tokens)
          (setq index (1+ index)))
-       (nreverse tokens))))
+       (list (nreverse tokens) nil nil nil))))
 
   (should-error
     (parser-generator-lex-analyzer--peek-next-look-ahead))
@@ -98,17 +99,19 @@
    (parser-generator-lex-analyzer--pop-token))
   (setq
    parser-generator-lex-analyzer--function
-   (lambda (index)
+   (lambda (index _state)
      (let* ((string '(("a" 1 . 2) ("b" 2 . 3)))
             (string-length (length string))
             (max-index index)
-            (tokens))
+            (tokens)
+            (new-index))
        (while (and
                (< (1- index) string-length)
                (< (1- index) max-index))
          (push (nth (1- index) string) tokens)
+         (setq new-index (cdr (cdr (nth (1- index) string))))
          (setq index (1+ index)))
-       (nreverse tokens))))
+       (list (nreverse tokens) nil new-index nil))))
   (should-error
    (parser-generator-lex-analyzer--pop-token))
   (parser-generator-lex-analyzer--reset)
@@ -122,10 +125,12 @@
    (equal
     '(("a" 1 . 2))
     (parser-generator-lex-analyzer--pop-token)))
+  (message "was there")
   (should
    (equal
     '(("b" 2 . 3))
     (parser-generator-lex-analyzer--pop-token)))
+  (message "was here")
   (should
    (equal
     nil

Reply via email to