[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator cf4332ef0e 40/82: Started on LLk parsi
From: |
Christian Johansson |
Subject: |
[elpa] externals/parser-generator cf4332ef0e 40/82: Started on LLk parsing algorithm |
Date: |
Thu, 12 May 2022 13:28:16 -0400 (EDT) |
branch: externals/parser-generator
commit cf4332ef0e16267902b9b1dde6aae566487d4036
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Started on LLk parsing algorithm
---
parser-generator-ll.el | 76 +++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 66 insertions(+), 10 deletions(-)
diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 77783d254d..674d7378cd 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -30,13 +30,11 @@
(message "\n;; Starting generation of LL(k) parser-tables..\n")
(unless (parser-generator-ll--valid-grammar-p)
(error "Invalid grammar specified!"))
- (let ((parsing-table
- (parser-generator-ll--generate-parsing-table
- (parser-generator-ll--generate-tables))))
- (setq
- parser-generator-ll--parsing-table
- parsing-table)
- (message "\n;; Completed generation of LL(k) parser-tables.\n")))
+ (setq
+ parser-generator-ll--parsing-table
+ (parser-generator-ll--generate-parsing-table
+ (parser-generator-ll--generate-tables)))
+ (message "\n;; Completed generation of LL(k) parser-tables.\n"))
;;; Algorithms
@@ -474,10 +472,68 @@
(1+ sub-symbol-index))))))
valid))
-;; TODO Implement this .p 339
+;; Generally described at .p 339
(defun parser-generator-ll--parse ()
- "Parse input via lex-analyzer and return stuff."
- )
+ "Parse input via lex-analyzer and return parse trail."
+ (let ((accept)
+ (stack
+ (list
+ (list
+ (parser-generator--get-grammar-start)
+ parser-generator--eof-identifier)))
+ (output))
+ (while accept
+ (let* ((state (car stack))
+ (state-action-table
+ (gethash
+ state
+ parser-generator-ll--parsing-table))
+ (look-ahead
+ (parser-generator-lex-analyzer--peek-next-look-ahead)))
+
+ (unless look-ahead
+ (signal
+ 'error
+ (format
+ "Reached end of input without accepting!")))
+
+ (unless (gethash look-ahead state-action-table)
+ (let ((possible-look-aheads))
+ (maphash
+ (lambda (k _v) (push k possible-look-aheads))
+ state-action-table)
+ (setq
+ possible-look-aheads
+ (sort state-action-table))
+ (signal
+ 'error
+ (format
+ "Invalid look-ahead '%S' in state: '%S', valid look-aheads: '%S'"
+ look-ahead
+ state
+ possible-look-aheads))))
+
+ (let* ((action (gethash look-ahead state-action-table))
+ (action-type action))
+ (when (listp action)
+ (setq action-type (car action)))
+ (cond
+ ((equal action-type 'pop)
+ (push
+ (parser-generator-lex-analyzer--pop-token)
+ stack))
+
+ ((equal action-type 'reduce)
+ (push
+ (nth 1 action)
+ stack)
+ (push
+ (nth 2 action)
+ output))
+
+ ((equal action-type 'accept)
+ (setq accept t))))))
+ output))
(provide 'parser-generator-ll)
- [elpa] externals/parser-generator 9d6ca94d0e 02/82: More work on LL(k) parser, (continued)
- [elpa] externals/parser-generator 9d6ca94d0e 02/82: More work on LL(k) parser, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 6ce0dd9429 04/82: Improved function to calculate merge max terminal sets, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 52734d7160 16/82: Updated TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7b77032f71 22/82: Parser table generation for LLk now works for productions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator fe728f8ad8 23/82: Passing test for generating LLk parser table, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 3b9977b51b 28/82: More work on LLk test, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator f23bc217d8 30/82: More wrestling, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 6e91a4b498 32/82: More work on helper functions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 80dd506b65 33/82: More work on LL-helper functions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator e6f9ac545f 37/82: Cleanup after byte-compilation, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator cf4332ef0e 40/82: Started on LLk parsing algorithm,
Christian Johansson <=
- [elpa] externals/parser-generator f5f7b2c82b 41/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2e76c4b57e 42/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 8f9e4d4537 46/82: Passing 2 parse examples with k=2, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator fe0decba88 50/82: Passed one test for LLk where k=1, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 72bbadddc0 51/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2e2496d51f 54/82: Added notes, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2598402cc7 56/82: Added TODO item, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7f3c384b6d 55/82: Passing more LLk tests, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 0856bb7784 58/82: Started on refactor were k=1 will be treated with different algorithm, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2181545d26 64/82: Implemented test for validation of LL(1) grammar, Christian Johansson, 2022/05/12