branch: externals/parser-generator commit 35d6be3049520a4e81cd189dd31cb1a5207bfd26 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added TODO-items --- parser-generator.el | 40 +++++++++++++++++----------- test/parser-generator-lr-test.el | 16 ++++-------- test/parser-generator-test.el | 56 +++++++++++++++++++++++----------------- 3 files changed, 63 insertions(+), 49 deletions(-) diff --git a/parser-generator.el b/parser-generator.el index 28cefce..16d1e21 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -11,9 +11,9 @@ (defvar - parser-generator--attributes + parser-generator--context-sensitive-attributes nil - "List of valid attributes.") + "List of valid context-sensitive attributes.") (defvar parser-generator--debug @@ -31,6 +31,11 @@ "The identifier used for end of file identifier. Default value is '$.") (defvar + parser-generator--global-attributes + nil + "List of valid global attributes.") + +(defvar parser-generator--grammar nil "Current grammar used in parser.") @@ -51,14 +56,14 @@ "Current look-ahead number used.") (defvar - parser-generator--table-firsts + parser-generator--table-context-sensitive-attributes-p nil - "Hash-table of calculated firsts for quicker parser generation.") + "Hash-table of context-sensitive-attributes.") (defvar - parser-generator--table-attributes-p + parser-generator--table-firsts nil - "Hash-table of attributes.") + "Hash-table of calculated firsts for quicker parser generation.") (defvar parser-generator--table-look-aheads-p @@ -418,6 +423,9 @@ parser-generator--table-translations (make-hash-table :test 'equal)) + ;; TODO Should produce hash-tables of valid attributes here + ;; TODO and valid global and context-sensitive attributes + (let ((production-index 0) (new-productions)) (dolist (p productions) @@ -538,13 +546,15 @@ new-productions))) (setq - parser-generator--table-attributes-p + parser-generator--table-context-sensitive-attributes-p (make-hash-table :test 'equal)) - (dolist (attribute parser-generator--attributes) + (dolist + (attribute + parser-generator--context-sensitive-attributes) (puthash attribute t - parser-generator--table-attributes-p)) + parser-generator--table-context-sensitive-attributes-p)) (let ((look-aheads (parser-generator--get-grammar-look-aheads))) @@ -630,14 +640,14 @@ (setq index (1+ index))) response)) -(defun parser-generator--valid-attribute-p (attribute) - "Check if ATTRIBUTE is valid." +(defun parser-generator--valid-context-sensitive-attribute-p (attribute) + "Check if ATTRIBUTE is a valid context-sensitive attribute." (gethash attribute - parser-generator--table-attributes-p)) + parser-generator--table-context-sensitive-attributes-p)) -(defun parser-generator--valid-attributes-p (attributes) - "Check if all ATTRIBUTES are valid." +(defun parser-generator--valid-context-sensitive-attributes-p (attributes) + "Check if all ATTRIBUTES are valid context-sensitive attributes." (let ((is-valid t) (length (length attributes)) (index 0)) @@ -649,7 +659,7 @@ (let ((element (nth index attributes))) (unless - (parser-generator--valid-attribute-p + (parser-generator--valid-context-sensitive-attribute-p element) (setq is-valid diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 36e5b27..ee24d8d 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -58,7 +58,8 @@ (message "Starting tests for (parser-generator-lr--generate-action-tables)") ;; Example 5.32 p. 393 - (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-grammar + '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) (parser-generator-set-look-ahead-number 1) (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) @@ -121,6 +122,9 @@ ;; Inconsistent grammar! ((A) (a b) nil (c)) (index: 0) with look-ahead (c) conflicts with ((B) (a b) (c) ($)) (index: 1) with look-ahead (c) in sets: ((((A) (a b) nil (c)) ((B) (a b) (c) ($)))) + (setq + parser-generator--context-sensitive-attributes + nil) (parser-generator-set-grammar '( (Sp S A B) @@ -149,18 +153,8 @@ (let ((table-lr-items (parser-generator-lr--generate-goto-tables))) - - ;; TODO Should be a conflict in state 5 - (message - "conflict-lr-items: %S" - table-lr-items) - (message - "conflict-goto-tables: %S" - (parser-generator-lr--get-expanded-goto-tables)) (parser-generator-lr--generate-action-tables table-lr-items) - (message - "conflict-action-tables: %s" (parser-generator-lr--get-expanded-action-tables)) (should (equal '((0 (((a) shift))) diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index 1517347..476dc38 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -680,7 +680,7 @@ (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 + parser-generator--context-sensitive-attributes '(%prec)) (parser-generator-process-grammar) @@ -711,54 +711,61 @@ (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)") +(defun parser-generator-test--valid-context-sensitive-attribute-p () + "Test `parser-generator--valid-context-sensitive-attribute-p'." + (message "Starting tests for (parser-generator--valid-context-sensitive-attribute-p)") - (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) + (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 + parser-generator--context-sensitive-attributes '(%abc depth length)) (parser-generator-process-grammar) - (parser-generator--valid-attribute-p - '%abc) - (should (equal t - (parser-generator--valid-attribute-p + (parser-generator--valid-context-sensitive-attribute-p + 'depth))) + + (should + (equal + t + (parser-generator--valid-context-sensitive-attribute-p '%abc))) + (should (equal nil - (parser-generator--valid-attribute-p + (parser-generator--valid-context-sensitive-attribute-p '%prec))) - (message "Passed tests for (parser-generator--valid-attribute-p)")) + (message "Passed tests for (parser-generator--valid-context-sensitive-attribute-p)")) -(defun parser-generator-test--valid-attributes-p () - "Test `parser-generator--valid-attributes-p'." - (message "Starting tests for (parser-generator--valid-attributes-p)") +(defun parser-generator-test--valid-context-sensitive-attributes-p () + "Test `parser-generator--valid-context-sensitive-attributes-p'." + (message "Starting tests for (parser-generator--valid-context-sensitive-attributes-p)") + + (parser-generator-set-grammar + '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) - (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 + parser-generator--context-sensitive-attributes '(%abc depth length)) (parser-generator-process-grammar) (should (equal t - (parser-generator--valid-attributes-p + (parser-generator--valid-context-sensitive-attributes-p '(%abc 1 depth 0 length 3)))) (should (equal nil - (parser-generator--valid-attributes-p + (parser-generator--valid-context-sensitive-attributes-p '(%prec 0)))) - (message "Passed tests for (parser-generator--valid-attributes-p)")) + (message "Passed tests for (parser-generator--valid-context-sensitive-attributes-p)")) (defun parser-generator-test--valid-terminal-p () "Test `parser-generator--valid-terminal-p'." @@ -766,7 +773,7 @@ (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 + parser-generator--context-sensitive-attributes '(%prec)) (parser-generator-process-grammar) @@ -893,8 +900,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-context-sensitive-attribute-p) + (parser-generator-test--valid-context-sensitive-attributes-p) (parser-generator-test--valid-grammar-p) (parser-generator-test--valid-look-ahead-number-p) (parser-generator-test--valid-look-ahead-p) @@ -903,6 +910,9 @@ (parser-generator-test--valid-sentential-form-p) (parser-generator-test--valid-terminal-p) + ;; TODO Add tests for process-grammar that validates + ;; signals thrown with invalid symbols or attributes + ;; Algorithms (parser-generator-test--first) (parser-generator-test--e-free-first)