[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 5d9b98c 011/434: Added functions to va
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 5d9b98c 011/434: Added functions to validate G and k and tests |
Date: |
Mon, 29 Nov 2021 15:58:58 -0500 (EST) |
branch: externals/parser-generator
commit 5d9b98ce39e27b6a28c690b950e302e5f2c08b8d
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Added functions to validate G and k and tests
---
parser.el | 50 +++++++++++++++++++++++++---
test/parser-test.el | 96 ++++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 126 insertions(+), 20 deletions(-)
diff --git a/parser.el b/parser.el
index 1a6fb09..9f305e0 100644
--- a/parser.el
+++ b/parser.el
@@ -201,11 +201,53 @@
"Calculate empty-free-first K tokens of PRODUCTION in PRODUCTIONS."
(parser--first k production productions t))
-(defun parser--v-set (viable-prefix productions start)
- "Calculate valid LR-sets for each VIABLE-PREFIX of PRODUCTIONS from START."
+(defun parser--valid-look-ahead-number-p (k)
+ "Return if look-ahead number K is valid or not."
+ (and
+ (integerp k)
+ (>= k 0)))
+
+(defun parser--valid-grammar-p (G)
+ "Return if grammar G is valid or not. Grammar should contain list with 4
elements: non-terminals (N), terminals (T), productions (P), start (S) where N,
T and P are lists and S is a symbol."
+ (let ((valid-p t))
+ (unless (listp G)
+ (setq valid-p nil))
+ (when (and
+ valid-p
+ (not (= (length G) 4)))
+ (setq valid-p nil))
+ (when (and
+ valid-p
+ (or
+ (not (listp (nth 0 G)))
+ (not (listp (nth 1 G)))
+ (not (listp (nth 2 G)))
+ (not (symbolp (nth 3 G)))))
+ (setq valid-p nil))
+ valid-p))
+
+(defun parser--get-grammar-nonterminals (G)
+ "Return non-terminals of grammar G."
+ (nth 0 G))
+
+(defun parser--get-grammar-terminals (G)
+ "Return terminals of grammar G."
+ (nth 1 G))
+
+(defun parser--get-grammar-productions (G)
+ "Return productions of grammar G."
+ (nth 2 G))
+
+(defun parser--get-grammar-start (G)
+ "Return start of grammar G."
+ (nth 3 G))
+
+(defun parser--v-set (y G k)
+ "Calculate valid LRk-sets for the viable-prefix Y in grammar G with
look-ahead K."
(let ((v-set))
- (dolist (production productions)
- )
+ (unless (parser--valid-grammar-p G)
+ (error "Invalid grammar G!"))
+
v-set))
diff --git a/test/parser-test.el b/test/parser-test.el
index 6ded36e..d12a4e5 100644
--- a/test/parser-test.el
+++ b/test/parser-test.el
@@ -172,7 +172,7 @@
;; Example 5.28 page 402
(defun parser-test--empty-free-first ()
"Test `parser--empty-free-first'."
- (message "Starting tests for (parser-test--empty-free-first)")
+ (message "Starting tests for (parser--empty-free-first)")
;; Example 5.28 p 402
(should
@@ -188,33 +188,97 @@
(C c e)))))
(message "Passed empty-free-first 2 with complex grammar")
- (message "Passed tests for (parser-test--empty-free-first)"))
+ (message "Passed tests for (parser--empty-free-first)"))
-(defun parser-test--v-set ()
- "Test `parser--v-set'."
- (message "Starting tests for (parser-test--v-set)")
+;; (defun parser-test--v-set ()
+;; "Test `parser--v-set'."
+;; (message "Starting tests for (parser-test--v-set)")
+
+;; ;; Example 5.29 p 407
+;; (should
+;; (equal
+;; '("ca" "cb")
+;; (parser--v-set
+;; 'e
+;; '((S' S)
+;; (S SaSb)
+;; (S e))
+;; 'S')))
+;; (message "Passed empty-free-first 2 with complex grammar")
+
+;; (message "Passed tests for (parser-test--v-set)"))
+
+(defun parser-test--valid-grammar-p ()
+ "Test function `parser--valid-grammar-p'."
+ (message "Starting tests for (parser--valid-grammar-p)")
- ;; Example 5.29 p 407
(should
(equal
- '("ca" "cb")
- (parser--v-set
- 'e
- '((S' S)
- (S SaSb)
- (S e))
- 'S')))
- (message "Passed empty-free-first 2 with complex grammar")
+ nil
+ (parser--valid-grammar-p 'B)))
- (message "Passed tests for (parser-test--v-set)"))
+ (should
+ (equal
+ nil
+ (parser--valid-grammar-p "A")))
+
+ (should
+ (equal
+ nil
+ (parser--valid-grammar-p '(A B C))))
+
+ (should
+ (equal
+ t
+ (parser--valid-grammar-p '((A B C) (a b c) ((A ab a)(B b)(C c)) A))))
+
+ (message "Passed tests for (parser--valid-grammar-p)"))
+
+(defun parser-test--valid-look-ahead-number-p ()
+ "Test function `parser--valid-look-ahead-number-p'."
+ (message "Starting tests for (parser--valid-look-ahead-number-p)")
+
+ (should
+ (equal
+ nil
+ (parser--valid-look-ahead-number-p 'A)))
+
+ (should
+ (equal
+ nil
+ (parser--valid-look-ahead-number-p "A")))
+
+ (should
+ (equal
+ nil
+ (parser--valid-look-ahead-number-p -2)))
+
+ (should
+ (equal
+ nil
+ (parser--valid-look-ahead-number-p 3.3)))
+
+ (should
+ (equal
+ t
+ (parser--valid-look-ahead-number-p 2)))
+
+ (should
+ (equal
+ t
+ (parser--valid-look-ahead-number-p 1)))
+ (message "Passed tests for (parser--valid-look-ahead-number-p)"))
(defun parser-test ()
"Run test."
+ (parser-test--valid-look-ahead-number-p)
+ (parser-test--valid-grammar-p)
(parser-test--distinct)
(parser-test--first)
(parser-test--empty-free-first)
- (parser-test--v-set))
+ ;; (parser-test--v-set)
+ )
(provide 'parser-test)
- [elpa] branch externals/parser-generator created (now 4a3a51d), ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b93ab8c 001/434: My initial commit, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b8faa17 002/434: FIRSTk and EFFk working, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ee0a623 003/434: Added TRAVIS and LICENSE, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f5bfa40 004/434: Fixed typo in README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 58798c8 010/434: Starting on calculation of valid LK-sets for a valid grammar prefix, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f9c8348 008/434: Updated Travis and Makefil rule name, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5f65cfc 015/434: More refactoring, using lists instead of string as grammar data type, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f2791c1 022/434: Passed unit test 3 intermediate grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5d9b98c 011/434: Added functions to validate G and k and tests,
ELPA Syncer <=
- [elpa] externals/parser-generator 356720c 030/434: Passing all unit tests using new data structure, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e4fd795 007/434: Added compilation to test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 42d92f1 014/434: More refactoring, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f648b52 020/434: Passing first unit test for FIRST after new data-structure refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a4bbb2f 026/434: Using PDA algorithm for FIRST when β is above 1 symbol, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e02d5d7 049/434: More work on calculating valid LR-items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0465b58 045/434: Improved commenting, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 85dde51 009/434: Added License and Travis build logos, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7bc3b70 017/434: Updated tests to use new data structure, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ab4b4db 021/434: Passed second FIRST test again, ELPA Syncer, 2021/11/29