[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator dcbbdee 315/434: Started on support fo
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator dcbbdee 315/434: Started on support for symbol attributes |
Date: |
Mon, 29 Nov 2021 16:00:05 -0500 (EST) |
branch: externals/parser-generator
commit dcbbdeedc892d27cb510eb4b3f821e18a00cb8f6
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Started on support for symbol attributes
---
parser-generator.el | 96 ++++++++++++++++++++++++++++++++++++-------
test/parser-generator-test.el | 94 ++++++++++++++++++++++++++++++++++++------
2 files changed, 163 insertions(+), 27 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index a11d9e4..e662c87 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -10,63 +10,88 @@
;;; Variables:
-(defvar parser-generator--debug
+(defvar
+ parser-generator--attributes
+ nil
+ "List of valid attributes.")
+
+(defvar
+ parser-generator--debug
nil
"Whether to print debug messages or not.")
-(defvar parser-generator--e-identifier
+(defvar
+ parser-generator--e-identifier
'e
"The identifier used for ε-symbol. Default value 'e.")
-(defvar parser-generator--eof-identifier
+(defvar
+ parser-generator--eof-identifier
'$
"The identifier used for end of file identifier. Default value is '$.")
-(defvar parser-generator--grammar
+(defvar
+ parser-generator--grammar
nil
"Current grammar used in parser.")
-(defvar parser-generator--f-sets
+(defvar
+ parser-generator--f-sets
nil
"Generated F-sets for grammar.")
-(defvar parser-generator--f-free-sets
+(defvar
+ parser-generator--f-free-sets
nil
"Generated e-free F-sets for grammar.")
-(defvar parser-generator--look-ahead-number
+(defvar
+ parser-generator--look-ahead-number
nil
"Current look-ahead number used.")
-(defvar parser-generator--table-firsts
+(defvar
+ parser-generator--table-firsts
nil
"Hash-table of calculated firsts for quicker parser generation.")
-(defvar parser-generator--table-look-aheads-p
+(defvar
+ parser-generator--table-attributes-p
+ nil
+ "Hash-table of attributes.")
+
+(defvar
+ parser-generator--table-look-aheads-p
nil
"Hash-table of look-aheads for quick checking.")
-(defvar parser-generator--table-non-terminal-p
+(defvar
+ parser-generator--table-non-terminal-p
nil
"Hash-table of terminals for quick checking.")
-(defvar parser-generator--table-productions-rhs
+(defvar
+ parser-generator--table-productions-rhs
nil
"Hash-table of productions RHS indexed by LHS for quick retrieving.")
-(defvar parser-generator--table-productions-number
+(defvar
+ parser-generator--table-productions-number
nil
"Hash-table indexed by production and value is production-number.")
-(defvar parser-generator--table-productions-number-reverse
+(defvar
+ parser-generator--table-productions-number-reverse
nil
"Hash-table indexed by production-number and value is production.")
-(defvar parser-generator--table-terminal-p
+(defvar
+ parser-generator--table-terminal-p
nil
"Hash-table of non-terminals for quick checking.")
-(defvar parser-generator--table-translations
+(defvar
+ parser-generator--table-translations
nil
"Hash-table indexed by production-number and value is translation function.")
@@ -501,6 +526,15 @@
parser-generator--grammar)
new-productions)))
+ (setq
+ parser-generator--table-attributes-p
+ (make-hash-table :test 'equal))
+ (dolist (attribute parser-generator--attributes)
+ (puthash
+ attribute
+ t
+ parser-generator--table-attributes-p))
+
(let ((look-aheads
(parser-generator--get-grammar-look-aheads)))
(setq
@@ -585,6 +619,38 @@
(setq index (1+ index)))
response))
+(defun parser-generator--valid-attribute-p (attribute)
+ "Check if ATTRIBUTE is valid."
+ (gethash
+ attribute
+ parser-generator--table-attributes-p))
+
+(defun parser-generator--valid-attributes-p (attributes)
+ "Check if all ATTRIBUTES are valid."
+ (let ((is-valid t)
+ (length (length attributes))
+ (index 0))
+ (unless (listp attributes)
+ (setq is-valid nil))
+ (while (and
+ is-valid
+ (< index length))
+ (let ((element
+ (nth index attributes)))
+ (unless
+ (parser-generator--valid-attribute-p
+ element)
+ (message "'%S' is not valid in '%S' from '%S' index: '%S'"
+ element
+ parser-generator--table-attributes-p
+ attributes
+ index)
+ (setq
+ is-valid
+ nil)))
+ (setq index (+ index 2)))
+ is-valid))
+
(defun parser-generator--valid-e-p (symbol)
"Return whether SYMBOL is the e identifier or not."
(eq symbol parser-generator--e-identifier))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index dfa9f73..1445fbe 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -480,6 +480,11 @@
(should
(equal
+ t
+ (parser-generator--valid-grammar-p '((A B C) ("a" "b" "c") ((A ("a" (%prec
1)))) A))))
+
+ (should
+ (equal
nil
(parser-generator--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a"))
(A)))))
@@ -573,7 +578,7 @@
(defun parser-generator-test--valid-sentential-form-p ()
"Test `parser-generator--valid-sentential-form-p'."
- (message "Starting tests for (parser-generator--valid-sentential-form-p)")
+ (message "Starting tests for (parser-generator--valid-sentential-form-p)")
(parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (A ("b" "a")) (B
("b" (lambda(b) (message "Was here: %s" b))))) S))
(parser-generator-process-grammar)
@@ -598,7 +603,7 @@
(defun parser-generator-test--valid-production-p ()
"Test `parser-generator--valid-production-p'."
- (message "Starting tests for (parser-generator--valid-production-p)")
+ (message "Starting tests for (parser-generator--valid-production-p)")
(should (equal
t
@@ -628,11 +633,11 @@
t
(parser-generator--valid-production-p '(A (a (lambda(a) (message
"Here 3 %s"))) b))))
- (message "Passed tests for (parser-generator--valid-production-p)"))
+ (message "Passed tests for (parser-generator--valid-production-p)"))
(defun parser-generator-test--get-grammar-rhs ()
"Test `parser-generator--get-grammar-rhs'."
- (message "Started tests for (parser-generator--get-grammar-rhs)")
+ (message "Started tests for (parser-generator--get-grammar-rhs)")
(parser-generator-set-grammar
'((S A B) ("a" "b") ((S A) (A ("b" "a")) (B ("b" (lambda(b) (message "Was
here: %s" b))))) S))
@@ -667,13 +672,16 @@
(parser-generator-process-grammar)
- (message "Passed tests for (parser-generator--get-grammar-rhs)"))
+ (message "Passed tests for (parser-generator--get-grammar-rhs)"))
(defun parser-generator-test--valid-non-terminal-p ()
"Test `parser-generator--valid-non-terminal-p'."
- (message "Starting tests for (parser-generator--valid-non-terminal-p)")
+ (message "Starting tests for (parser-generator--valid-non-terminal-p)")
(parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
+ (setq
+ parser-generator--attributes
+ '(%prec))
(parser-generator-process-grammar)
(should
@@ -683,6 +691,10 @@
(should
(equal
t
+ (parser-generator--valid-non-terminal-p '(S (%prec 1)))))
+ (should
+ (equal
+ t
(parser-generator--valid-non-terminal-p 'A)))
(should
(equal
@@ -697,13 +709,65 @@
nil
(parser-generator--valid-non-terminal-p "a")))
- (message "Passed tests for (parser-generator--valid-non-terminal-p)"))
+ (message "Passed tests for (parser-generator--valid-non-terminal-p)"))
+
+(defun parser-generator-test--valid-attribute-p ()
+ "Test `parser-generator--valid-attribute-p'."
+ (message "Starting tests for (parser-generator--valid-attribute-p)")
+
+ (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
+ (setq
+ parser-generator--attributes
+ '(%abc depth length))
+ (parser-generator-process-grammar)
+
+ (parser-generator--valid-attribute-p
+ '%abc)
+
+ (should
+ (equal
+ t
+ (parser-generator--valid-attribute-p
+ '%abc)))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-attribute-p
+ '%prec)))
+
+ (message "Passed tests for (parser-generator--valid-attribute-p)"))
+
+(defun parser-generator-test--valid-attributes-p ()
+ "Test `parser-generator--valid-attributes-p'."
+ (message "Starting tests for (parser-generator--valid-attributes-p)")
+
+ (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
+ (setq
+ parser-generator--attributes
+ '(%abc depth length))
+ (parser-generator-process-grammar)
+
+ (should
+ (equal
+ t
+ (parser-generator--valid-attributes-p
+ '(%abc 1 depth 0 length 3))))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-attributes-p
+ '(%prec 0))))
+
+ (message "Passed tests for (parser-generator--valid-attributes-p)"))
(defun parser-generator-test--valid-terminal-p ()
"Test `parser-generator--valid-terminal-p'."
- (message "Starting tests for (parser-generator--valid-terminal-p)")
+ (message "Starting tests for (parser-generator--valid-terminal-p)")
(parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
+ (setq
+ parser-generator--attributes
+ '(%prec))
(parser-generator-process-grammar)
(should
@@ -713,6 +777,10 @@
(should
(equal
t
+ (parser-generator--valid-terminal-p '("a" (%prec 1)))))
+ (should
+ (equal
+ t
(parser-generator--valid-terminal-p "b")))
(should
(equal
@@ -727,11 +795,11 @@
nil
(parser-generator--valid-terminal-p 'A)))
- (message "Passed tests for (parser-generator--valid-terminal-p)"))
+ (message "Passed tests for (parser-generator--valid-terminal-p)"))
(defun parser-generator-test--merge-max-terminals ()
"Test `parser-generator--merge-max-terminals'."
- (message "Starting tests for (parser-generator--merge-max-terminals)")
+ (message "Starting tests for (parser-generator--merge-max-terminals)")
(should
(equal
@@ -749,11 +817,11 @@
'(b e)
3)))
- (message "Passed tests for (parser-generator--merge-max-terminals)"))
+ (message "Passed tests for (parser-generator--merge-max-terminals)"))
(defun parser-generator-test--get-list-permutations ()
"Test `parser-generator--get-list-permutations'."
- (message "Starting tests for (parser-generator--get-list-permutations)")
+ (message "Starting tests for (parser-generator--get-list-permutations)")
(parser-generator-set-look-ahead-number 1)
(parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
@@ -825,6 +893,8 @@
(parser-generator-test--get-list-permutations)
(parser-generator-test--merge-max-terminals)
(parser-generator-test--sort-list)
+ (parser-generator-test--valid-attribute-p)
+ (parser-generator-test--valid-attributes-p)
(parser-generator-test--valid-grammar-p)
(parser-generator-test--valid-look-ahead-number-p)
(parser-generator-test--valid-look-ahead-p)
- [elpa] externals/parser-generator 175a579 275/434: Passed test for generation action-table LR(0) grammar, (continued)
- [elpa] externals/parser-generator 175a579 275/434: Passed test for generation action-table LR(0) grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ecbbf21 290/434: Added test for exported translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cecf8fd 287/434: More TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 688e685 291/434: Lex-analyzer index is now buffer-local variable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0702765 293/434: Added incremental unit test for exported parser/translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 552c0c5 304/434: Using better hash-key for goto-tables generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d0d3201 299/434: FIRST calculation now handles cyclic productions, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5145cda 306/434: Improved hash-key integrity for LRk Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2227cae 313/434: Moved validation of valid lr-item set to generation of goto-tables, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a86c658 305/434: Improved output, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator dcbbdee 315/434: Started on support for symbol attributes,
ELPA Syncer <=
- [elpa] externals/parser-generator 0c1b8b6 316/434: Passing tests for symbol attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c886537 311/434: Using references for distinct goto-tables to optimize memory usage, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06bff4b 321/434: Improved validation of conflict-resolution using attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ea898ce 317/434: Fixed code-styling, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ae51103 323/434: Passing test for resolving conflict using precedence attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 35d6be3 327/434: Added TODO-items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4d60ed4 328/434: Added validation to context-sensitive attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ce9ae69 329/434: Improved comment, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b8a81c5 330/434: Added failing test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06d23f5 340/434: More debugging, ELPA Syncer, 2021/11/29