[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 770a788b4d 17/19: Passing final tests
From: |
Christian Johansson |
Subject: |
[elpa] externals/parser-generator 770a788b4d 17/19: Passing final tests for state-based lex-analyzer |
Date: |
Wed, 10 Jan 2024 15:35:24 -0500 (EST) |
branch: externals/parser-generator
commit 770a788b4d5eef02fc309215a7d6dd7a4fb9adc3
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Passing final tests for state-based lex-analyzer
---
TODO.md | 7 -
parser-generator-lex-analyzer.el | 14 +-
parser-generator-ll-export.el | 287 +++++++++++++++++------------
parser-generator-lr-export.el | 287 +++++++++++++++++------------
test/parser-generator-lex-analyzer-test.el | 16 +-
test/parser-generator-lr-test.el | 9 +-
6 files changed, 353 insertions(+), 267 deletions(-)
diff --git a/TODO.md b/TODO.md
index 65054c83de..952c7d226e 100644
--- a/TODO.md
+++ b/TODO.md
@@ -8,13 +8,6 @@ Functions (with validations) to set global variables:
* parser-generator--global-attributes
* parser-generator--global-declaration
-## Lex-analyzer
-
-* State-based lex-analyzer
-** Verify that parser-generator-lex-analyzer--index is used in exported
lex-analyzers
-** Verify that parser-generator-lex-analyzer--state-init is used in exported
lex-analyzers
-** Use buffered lexer when lexing in exported parsers as well
-
## LR-Parser
Functions (with validations) to set global variables:
diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el
index 474139ccbe..b68106cacd 100644
--- a/parser-generator-lex-analyzer.el
+++ b/parser-generator-lex-analyzer.el
@@ -45,26 +45,20 @@
(defvar-local
- parser-generator-lex-analyzer--index
+ parser-generator-lex-analyzer--buffered-response
nil
- "Index in lex-analyzer.")
+ "Buffered tokens of lex-analyzer.")
(defvar-local
- parser-generator-lex-analyzer--state
+ parser-generator-lex-analyzer--index
nil
- "State of lex-analyzer.")
+ "Index in lex-analyzer.")
(defvar-local
parser-generator-lex-analyzer--state
nil
"State of lex-analyzer.")
-(defvar-local
- parser-generator-lex-analyzer--buffered-response
- nil
- "Buffered tokens of lex-analyzer.")
-
-
;; Functions
diff --git a/parser-generator-ll-export.el b/parser-generator-ll-export.el
index dcb221a6d8..160acf9d9f 100644
--- a/parser-generator-ll-export.el
+++ b/parser-generator-ll-export.el
@@ -126,21 +126,41 @@
namespace
parser-generator--look-ahead-number))
- (insert "\n;;; Local Variables:\n\n")
+ ;; Lex-Analyzer Initial Index
+ (insert
+ (format
+ "(defvar\n %s-lex-analyzer--index-init\n %S\n \"Initial value of
index.\")\n\n"
+ namespace
+ parser-generator-lex-analyzer--index-init))
- ;; Index
+ ;; Lex-Analyzer Initial State
+ (insert
+ (format
+ "(defvar\n %s-lex-analyzer--state-init\n %S\n \"Initial value of
state.\")\n\n"
+ namespace
+ parser-generator-lex-analyzer--state-init))
+
+ (insert "\n;;; Buffer-Local Variables:\n\n\n")
+
+ ;; Lex-Analyzer Buffered Response
+ (insert
+ (format
+ "(defvar-local\n %s-lex-analyzer--buffered-response\n nil\n
\"Buffered tokens of lex-analyzer.\")\n\n"
+ namespace))
+
+ ;; Lex-Analyzer Index
(insert
(format
"(defvar-local\n %s-lex-analyzer--index\n 0\n \"The current index
of the lex-analyzer.\")\n\n"
namespace))
- ;; State
+ ;; Lex-Analyzer State
(insert
(format
"(defvar-local\n %s-lex-analyzer--state\n nil\n \"The current state
of the lex-analyzer.\")\n\n"
namespace))
- (insert "\n;;; Variable Functions:\n\n")
+ (insert "\n;;; Variable Functions:\n\n\n")
;; Lex-Analyzer Get Function
(insert
@@ -209,13 +229,23 @@
%s-lex-analyzer--reset
()
\"Reset Lex-Analyzer.\"
+ (setq
+ %s-lex-analyzer--buffered-response
+ (make-hash-table :test 'equal))
(setq
%s-lex-analyzer--index
- 1)
+ %s-lex-analyzer--index-init)
+ (setq
+ %s-lex-analyzer--state
+ %s-lex-analyzer--state-init)
(when
%s-lex-analyzer--reset-function
(funcall
%s-lex-analyzer--reset-function)))\n"
+ namespace
+ namespace
+ namespace
+ namespace
namespace
namespace
namespace
@@ -241,75 +271,36 @@
(while (<
look-ahead-length
k)
- (condition-case error
- (progn
- (let* ((result-list
- (funcall
- %s-lex-analyzer--function
- index
- 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
- index
- move-to-index-flag)
- (setq
- state
- new-state))
+ (let* ((result-list
+ (%s-lex-analyzer--get-buffered-lex
+ index
+ state))
+ (token
+ (nth 0 result-list))
+ (new-index
+ (nth 2 result-list))
+ (new-state
+ (nth 3 result-list)))
+ (push
+ token
+ look-ahead)
+ (setq
+ look-ahead-length
+ (1+ look-ahead-length))
+ (setq
+ index
+ new-index)
+ (setq
+ state
+ new-state)))
- (if token
- (progn
- (setq index new-index)
- (unless (listp (car token))
- (setq token (list token)))
- (let ((token-count (length token))
- (token-index 0))
- (while
- (and
- (<
- look-ahead-length
- k)
- (<
- token-index
- token-count))
- (let ((next-look-ahead-item
- (nth token-index token)))
- (push
- next-look-ahead-item
- look-ahead)
- (setq
- look-ahead-length
- (1+ look-ahead-length))
- (setq
- token-index
- (1+ token-index))))))
-
- ;; Fill up look-ahead with EOF-identifier if we found nothing
- (push (list %s--eof-identifier) look-ahead)
- (setq look-ahead-length (1+ look-ahead-length))
- (setq index (1+ index))))))"
+ (nreverse look-ahead)))\n"
namespace
namespace
namespace
namespace
namespace
- namespace))
- (insert "
- (error
- (error
- \"Lex-analyze failed to peek next look-ahead at %s, error: %s,
look-ahead: %S\"
- index
- error
- look-ahead))))
- (nreverse look-ahead)))\n")
+ ))
;; Lex-Analyzer Pop Token
(insert
@@ -317,45 +308,105 @@
(defun
%s-lex-analyzer--pop-token ()
\"Pop next token via lex-analyzer.\"
- (let ((continue t)
- (tokens))
- (while continue
- (condition-case error
- (progn
- (let* ((result-list
- (funcall
- %s-lex-analyzer--function
- %s-lex-analyzer--index
- %s-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
- %s-lex-analyzer--index
- move-to-index-flag)
- (setq-local
- %s-lex-analyzer--state
- new-state))
- (setq
- %s-lex-analyzer--index
- new-index)
- (when token
- (unless (listp (car token))
- (setq token (list token)))
- (let ((first-token (car token)))
- (push
- first-token
- tokens)))
- (setq
- continue
- nil))))"
+ (let* ((result-list
+ (%s-lex-analyzer--get-buffered-lex
+ %s-lex-analyzer--index
+ %s-lex-analyzer--state))
+ (token
+ (nth 0 result-list))
+ (new-index
+ (nth 2 result-list))
+ (new-state
+ (nth 3 result-list)))
+ (setq-local
+ %s-lex-analyzer--index
+ new-index)
+ (setq-local
+ %s-lex-analyzer--state
+ new-state)
+ (list token)))\n"
+ namespace
+ namespace
+ namespace
+ namespace
+ namespace
+ namespace
+ ))
+
+ (insert
+ (format "
+(defun %s-lex-analyzer--get-buffered-lex (index state)
+ \"Get next token in stream, use buffer to only call function when needed.\"
+ (unless (gethash
+ index
+ %s-lex-analyzer--buffered-response)
+ (let ((continue t)
+ (tmp-index index)
+ (tmp-state state))
+ (while continue
+ (condition-case error
+ (progn
+ (let* ((result-list
+ (funcall
+ %s-lex-analyzer--function
+ tmp-index
+ tmp-state))
+ (tokens
+ (nth 0 result-list))
+ (move-to-index-flag
+ (nth 1 result-list))
+ (new-state
+ (nth 2 result-list)))
+ (if move-to-index-flag
+ (progn
+ (setq
+ tmp-index
+ move-to-index-flag)
+ (setq
+ tmp-state
+ new-state))
+
+ (if tokens
+
+ (progn
+ (unless (listp (car tokens))
+ (setq tokens (list tokens)))
+
+ (let* ((first-token (car tokens))
+ (first-token-start (car (cdr first-token)))
+ (first-token-end (cdr (cdr first-token))))
+ (when (< index first-token-start)
+ (let ((token-start index))
+ (while (< token-start first-token-start)
+ (puthash
+ token-start
+ (list
+ first-token
+ nil
+ first-token-end
+ nil)
+ %s-lex-analyzer--buffered-response)
+ (setq
+ token-start
+ (1+ token-start))))))
+
+ (dolist (token tokens)
+ (let ((token-start (car (cdr token)))
+ (token-end (cdr (cdr token))))
+ (puthash
+ token-start
+ (list token nil token-end new-state)
+ %s-lex-analyzer--buffered-response))))
+
+ ;; Fill up look-ahead with EOF-identifier if we found
nothing
+ (puthash
+ index
+ (list (list %s--eof-identifier) nil (1+ index) nil)
+ %s-lex-analyzer--buffered-response))
+
+ (setq
+ continue
+ nil))))"
namespace
namespace
namespace
@@ -363,14 +414,22 @@
namespace
namespace
namespace))
+
(insert "
- (error (error
- \"Lex-analyze failed to pop token at %s, error: %s\"")
- (insert (format "
- %s-lex-analyzer--index
- (car (cdr error))))))
- (nreverse tokens)))\n"
- namespace))
+ (error
+ (error
+ \"Lex-analyze failed to get next token at: %s in state: %s, error:
%s\"
+ index
+ state
+ error))))))")
+
+ (insert
+ (format "
+ (gethash
+ index
+ %s-lex-analyzer--buffered-response))\n"
+ namespace
+ ))
(insert "\n\n;;; Functions for Syntax-Analyzer / Parser:\n\n");
diff --git a/parser-generator-lr-export.el b/parser-generator-lr-export.el
index 69f47ed41c..7529d70dc7 100644
--- a/parser-generator-lr-export.el
+++ b/parser-generator-lr-export.el
@@ -147,21 +147,41 @@
namespace
parser-generator--look-ahead-number))
- (insert "\n;;; Local Variables:\n\n")
+ ;; Lex-Analyzer Initial Index
+ (insert
+ (format
+ "(defvar\n %s-lex-analyzer--index-init\n %S\n \"Initial value of
index.\")\n\n"
+ namespace
+ parser-generator-lex-analyzer--index-init))
- ;; Index
+ ;; Lex-Analyzer Initial State
+ (insert
+ (format
+ "(defvar\n %s-lex-analyzer--state-init\n %S\n \"Initial value of
state.\")\n\n"
+ namespace
+ parser-generator-lex-analyzer--state-init))
+
+ (insert "\n;;; Buffer-Local Variables:\n\n\n")
+
+ ;; Lex-Analyzer Buffered Response
+ (insert
+ (format
+ "(defvar-local\n %s-lex-analyzer--buffered-response\n nil\n
\"Buffered tokens of lex-analyzer.\")\n\n"
+ namespace))
+
+ ;; Lex-Analyzer Index
(insert
(format
"(defvar-local\n %s-lex-analyzer--index\n 0\n \"The current index
of the lex-analyzer.\")\n\n"
namespace))
- ;; State
+ ;; Lex-Analyzer State
(insert
(format
"(defvar-local\n %s-lex-analyzer--state\n nil\n \"The current state
of the lex-analyzer.\")\n\n"
namespace))
- (insert "\n;;; Variable Functions:\n\n")
+ (insert "\n;;; Variable Functions:\n\n\n")
;; Lex-Analyzer Get Function
(insert
@@ -230,13 +250,23 @@
%s-lex-analyzer--reset
()
\"Reset Lex-Analyzer.\"
+ (setq
+ %s-lex-analyzer--buffered-response
+ (make-hash-table :test 'equal))
(setq
%s-lex-analyzer--index
- 1)
+ %s-lex-analyzer--index-init)
+ (setq
+ %s-lex-analyzer--state
+ %s-lex-analyzer--state-init)
(when
%s-lex-analyzer--reset-function
(funcall
%s-lex-analyzer--reset-function)))\n"
+ namespace
+ namespace
+ namespace
+ namespace
namespace
namespace
namespace
@@ -262,75 +292,36 @@
(while (<
look-ahead-length
k)
- (condition-case error
- (progn
- (let* ((result-list
- (funcall
- %s-lex-analyzer--function
- index
- 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
- index
- move-to-index-flag)
- (setq
- state
- new-state))
-
- (if token
- (progn
- (setq index new-index)
- (unless (listp (car token))
- (setq token (list token)))
- (let ((token-count (length token))
- (token-index 0))
- (while
- (and
- (<
- look-ahead-length
- k)
- (<
- token-index
- token-count))
- (let ((next-look-ahead-item
- (nth token-index token)))
- (push
- next-look-ahead-item
- look-ahead)
- (setq
- look-ahead-length
- (1+ look-ahead-length))
- (setq
- token-index
- (1+ token-index))))))
+ (let* ((result-list
+ (%s-lex-analyzer--get-buffered-lex
+ index
+ state))
+ (token
+ (nth 0 result-list))
+ (new-index
+ (nth 2 result-list))
+ (new-state
+ (nth 3 result-list)))
+ (push
+ token
+ look-ahead)
+ (setq
+ look-ahead-length
+ (1+ look-ahead-length))
+ (setq
+ index
+ new-index)
+ (setq
+ state
+ new-state)))
- ;; Fill up look-ahead with EOF-identifier if we found nothing
- (push (list %s--eof-identifier) look-ahead)
- (setq look-ahead-length (1+ look-ahead-length))
- (setq index (1+ index))))))"
+ (nreverse look-ahead)))\n"
namespace
namespace
namespace
namespace
namespace
- namespace))
- (insert "
- (error
- (error
- \"Lex-analyze failed to peek next look-ahead at %s, error: %s,
look-ahead: %S\"
- index
- error
- look-ahead))))
- (nreverse look-ahead)))\n")
+ ))
;; Lex-Analyzer Pop Token
(insert
@@ -338,45 +329,105 @@
(defun
%s-lex-analyzer--pop-token ()
\"Pop next token via lex-analyzer.\"
- (let ((continue t)
- (tokens))
- (while continue
- (condition-case error
- (progn
- (let* ((result-list
- (funcall
- %s-lex-analyzer--function
- %s-lex-analyzer--index
- %s-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
- %s-lex-analyzer--index
- move-to-index-flag)
- (setq-local
- %s-lex-analyzer--state
- new-state))
- (setq
- %s-lex-analyzer--index
- new-index)
- (when token
- (unless (listp (car token))
- (setq token (list token)))
- (let ((first-token (car token)))
- (push
- first-token
- tokens)))
- (setq
- continue
- nil))))"
+ (let* ((result-list
+ (%s-lex-analyzer--get-buffered-lex
+ %s-lex-analyzer--index
+ %s-lex-analyzer--state))
+ (token
+ (nth 0 result-list))
+ (new-index
+ (nth 2 result-list))
+ (new-state
+ (nth 3 result-list)))
+ (setq-local
+ %s-lex-analyzer--index
+ new-index)
+ (setq-local
+ %s-lex-analyzer--state
+ new-state)
+ (list token)))\n"
+ namespace
+ namespace
+ namespace
+ namespace
+ namespace
+ namespace
+ ))
+
+ (insert
+ (format "
+(defun %s-lex-analyzer--get-buffered-lex (index state)
+ \"Get next token in stream, use buffer to only call function when needed.\"
+ (unless (gethash
+ index
+ %s-lex-analyzer--buffered-response)
+ (let ((continue t)
+ (tmp-index index)
+ (tmp-state state))
+ (while continue
+ (condition-case error
+ (progn
+ (let* ((result-list
+ (funcall
+ %s-lex-analyzer--function
+ tmp-index
+ tmp-state))
+ (tokens
+ (nth 0 result-list))
+ (move-to-index-flag
+ (nth 1 result-list))
+ (new-state
+ (nth 2 result-list)))
+ (if move-to-index-flag
+ (progn
+ (setq
+ tmp-index
+ move-to-index-flag)
+ (setq
+ tmp-state
+ new-state))
+
+ (if tokens
+
+ (progn
+ (unless (listp (car tokens))
+ (setq tokens (list tokens)))
+
+ (let* ((first-token (car tokens))
+ (first-token-start (car (cdr first-token)))
+ (first-token-end (cdr (cdr first-token))))
+ (when (< index first-token-start)
+ (let ((token-start index))
+ (while (< token-start first-token-start)
+ (puthash
+ token-start
+ (list
+ first-token
+ nil
+ first-token-end
+ nil)
+ %s-lex-analyzer--buffered-response)
+ (setq
+ token-start
+ (1+ token-start))))))
+
+ (dolist (token tokens)
+ (let ((token-start (car (cdr token)))
+ (token-end (cdr (cdr token))))
+ (puthash
+ token-start
+ (list token nil token-end new-state)
+ %s-lex-analyzer--buffered-response))))
+
+ ;; Fill up look-ahead with EOF-identifier if we found
nothing
+ (puthash
+ index
+ (list (list %s--eof-identifier) nil (1+ index) nil)
+ %s-lex-analyzer--buffered-response))
+
+ (setq
+ continue
+ nil))))"
namespace
namespace
namespace
@@ -384,14 +435,22 @@
namespace
namespace
namespace))
+
(insert "
- (error (error
- \"Lex-analyze failed to pop token at %s, error: %s\"")
- (insert (format "
- %s-lex-analyzer--index
- (car (cdr error))))))
- (nreverse tokens)))\n"
- namespace))
+ (error
+ (error
+ \"Lex-analyze failed to get next token at: %s in state: %s, error:
%s\"
+ index
+ state
+ error))))))")
+
+ (insert
+ (format "
+ (gethash
+ index
+ %s-lex-analyzer--buffered-response))\n"
+ namespace
+ ))
(insert "\n\n;;; Functions for Syntax-Analyzer / Parser:\n\n");
diff --git a/test/parser-generator-lex-analyzer-test.el
b/test/parser-generator-lex-analyzer-test.el
index df3f674671..b6747d51cb 100644
--- a/test/parser-generator-lex-analyzer-test.el
+++ b/test/parser-generator-lex-analyzer-test.el
@@ -29,13 +29,11 @@
(string-length (length string))
(max-index index)
(tokens)
- (next-token)
- (new-index))
+ (next-token))
(while (and
(< (1- index) string-length)
(< (1- index) max-index))
(setq next-token (nth (1- index) string))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))
(list (nreverse tokens)))))
@@ -73,7 +71,6 @@
(string-length (length string))
(max-index index)
(tokens)
- (new-index)
(next-token))
(while (and
(< (1- index) string-length)
@@ -81,7 +78,6 @@
(setq next-token (nth (1- index) string))
(when (string= (car next-token) "d")
(error "Invalid token: %s" next-token))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))
(list (nreverse tokens)))))
@@ -98,7 +94,6 @@
(string-length (length string))
(max-index index)
(tokens)
- (new-index)
(new-state)
(next-token))
(while (and
@@ -120,14 +115,12 @@
(setq next-token (nth (1- index) string))
(when (string= (car next-token) "d")
(error "Invalid token: %s" next-token))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))))
((equal state (list 'epislon))
(setq next-token (nth (1- index) string))
(when (string= (car next-token) "d")
(error "Invalid token: %s" next-token))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))
(t
@@ -159,13 +152,11 @@
(let* ((string '(("a" 1 . 2) ("b" 2 . 3)))
(string-length (length string))
(max-index index)
- (tokens)
- (new-index))
+ (tokens))
(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)))
(list (nreverse tokens)))))
(should-error
@@ -197,7 +188,6 @@
(string-length (length string))
(max-index index)
(tokens)
- (new-index)
(new-state)
(next-token))
(while (and
@@ -219,14 +209,12 @@
(setq next-token (nth (1- index) string))
(when (string= (car next-token) "d")
(error "Invalid token: %s" next-token))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))))
((equal state (list 'epislon))
(setq next-token (nth (1- index) string))
(when (string= (car next-token) "d")
(error "Invalid token: %s" next-token))
- (setq new-index (cdr (cdr (nth (1- index) string))))
(push next-token tokens)
(setq index (1+ index)))
(t
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 687a493a19..6d61e56a9f 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -318,8 +318,7 @@
parser-generator-lex-analyzer--function
(lambda (index _state)
(with-current-buffer "*buffer*"
- (let ((token)
- (new-index))
+ (let ((token))
(when
(<
index
@@ -335,9 +334,6 @@
(cond
((looking-at "\\([0-9]+\\.[0-9]+\\|[0-9]+\\)")
- (setq
- new-index
- (match-end 0))
(setq
token
`(NUM ,(match-beginning 0) . ,(match-end 0))))
@@ -346,9 +342,6 @@
(buffer-substring-no-properties
(match-beginning 0)
(match-end 0))))
- (setq
- new-index
- (match-end 0))
(setq
token
`(,symbol ,(match-beginning 0) . ,(match-end 0)))))
- [elpa] externals/parser-generator 6a7dcdb8db 07/19: Passing unit tests for LR parsers, (continued)
- [elpa] externals/parser-generator 6a7dcdb8db 07/19: Passing unit tests for LR parsers, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator 6f09a9ca67 19/19: Updated copyright years, version and modified date, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator c417cb10f2 09/19: Fixes for byte-compilation warnings, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator d96c81cb84 06/19: Passing lr-tests after refactor, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator af5a8b0c68 03/19: Improvements in testing and exporting, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator 4e02cf6d0f 18/19: Improved readme, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator b55aba0ba4 14/19: More notes, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator cfc687a662 11/19: More work on refactoring lexer to handle states and using a buffer, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator c05af8579e 02/19: Improved documentation, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator f158de436f 10/19: Updated TODO items, Christian Johansson, 2024/01/10
- [elpa] externals/parser-generator 770a788b4d 17/19: Passing final tests for state-based lex-analyzer,
Christian Johansson <=
- [elpa] externals/parser-generator 48bc7edaa3 12/19: More work on buffered lexer, Christian Johansson, 2024/01/10