branch: externals/parser-generator commit e6f9ac545f64f140908c42901be4bd9d12e1cf1f Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Cleanup after byte-compilation --- parser-generator-ll.el | 27 ++++------ parser-generator.el | 2 +- test/parser-generator-ll-test.el | 114 +++++++++++++++++++++++---------------- 3 files changed, 79 insertions(+), 64 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index c31b8ec216..4df259ef93 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -28,10 +28,11 @@ (defun parser-generator-ll-generate-parser-tables () "Generate parsing tables for grammar." (message "\n;; Starting generation of LL(k) parser-tables..\n") - (unless (parser-generator-ll--valid-llk-p parser-generator--grammar) + (unless (parser-generator-ll--valid-grammar-p) (error "Invalid grammar specified!")) - (let* ((tables (parser-generator-ll--generate-tables)) - (parsing-table (parser-generator-ll--generate-parsing-table))) + (let ((parsing-table + (parser-generator-ll--generate-parsing-table + (parser-generator-ll--generate-tables)))) (setq parser-generator-ll--parsing-table parsing-table) @@ -48,16 +49,13 @@ (distinct-item-p (make-hash-table :test 'equal)) (stack) (distinct-stack-item-p (make-hash-table :test 'equal)) - (stack-item) - (k (max 1 parser-generator--look-ahead-number))) + (stack-item)) ;; (1) Construct T_0, the LL(k) table associated with S {e} (let* ((start (parser-generator--get-grammar-start)) (start-rhss (parser-generator--get-grammar-rhs start))) (dolist (start-rhs start-rhss) - (let* ((production - (list (list start) start-rhs)) - (initial-stack-item + (let* ((initial-stack-item (list (list start) start-rhs @@ -122,7 +120,7 @@ first-parent-follow))) (t (error "Unexpected empty FIRST for production: %S and parent-follow: %S" - production + (list production-lhs production-rhs) parent-follow))) (parser-generator--debug @@ -185,9 +183,7 @@ local-follow sets) (dolist (sub-symbol-rhs sub-symbol-rhss) - (let* ((sub-symbol-production - (list (list sub-symbol) sub-symbol-rhs)) - (new-stack-item + (let* ((new-stack-item (list (list sub-symbol) sub-symbol-rhs @@ -328,8 +324,6 @@ (dolist (table tables) (let* ((key (nth 0 table)) (value (nth 1 table)) - (key-stack-symbol (car (nth 0 key))) - (key-parent-follow-set (nth 1 key)) (left-hand-side (nth 0 key)) (parse-table)) (dolist (look-ahead-row value) @@ -388,7 +382,6 @@ "Test for LL(k)-ness. Output t if grammar is LL(k). nil otherwise." (let ((stack) (stack-item) - (k (max 1 parser-generator--look-ahead-number)) (distinct-production-p (make-hash-table :test 'equal)) (valid t)) @@ -412,9 +405,7 @@ stack valid) (setq stack-item (pop stack)) - (let ((production-lhs - (nth 0 stack-item)) - (production-rhs + (let ((production-rhs (nth 1 stack-item))) ;; For each non-terminal in the production right-hand side diff --git a/parser-generator.el b/parser-generator.el index 2b0b760717..8425475186 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -45,7 +45,7 @@ (defvar parser-generator--debug - t + nil "Whether to print debug messages or not.") (defvar diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index fd6f70c598..58829b2f18 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -31,7 +31,6 @@ ) (parser-generator-process-grammar) (let ((tables (parser-generator-ll--generate-tables))) - ;; (message "tables 1: %S" tables) (should (equal tables @@ -126,44 +125,29 @@ "Test `parser-generator-ll--generate-parsing-table'." (message "Started tests for (parser-generator-ll--generate-parsing-table)") - (parser-generator-set-eof-identifier '$) (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 2) + (parser-generator-set-grammar + '( + (S A) + (a b) + ( + (S (a A a a) (b A b a)) + (A b e) + ) + S + ) + ) (parser-generator-process-grammar) - (let* ((tables - '( - ( - ((A) (b a)) - ( - ((b b) (b) nil) - ((b a) (e) nil) - ) - ) - ( - ((A) (a a)) - ( - ((a a) (e) nil) - ((b a) (b) nil) - ) - ) - ( - ((S) nil) - ( - ((a b) (a A a a) ((a a))) - ((a a) (a A a a) ((a a))) - ((b b) (b A b a) ((b a))) - ) - ) - ) - ) - (parser-tables - (parser-generator-ll--generate-parsing-table - tables))) + (let ((parser-tables + (parser-generator-ll--generate-parsing-table + (parser-generator-ll--generate-tables)))) + ;; (message "parser-tables: %S" parser-tables) (should (equal '( ( - ((S) nil) ;; T0 + ((S) ($)) ;; T0 ( ((b b) reduce (b ((A) (b a)) b a) 1) ((a a) reduce (a ((A) (a a)) a a) 0) @@ -178,7 +162,7 @@ ) ) ( - ((A) (b a));; T2 + ((A) (b a)) ;; T2 ( ((b a) reduce (e) 3) ((b b) reduce (b) 2) @@ -206,9 +190,8 @@ ) ) parser-tables))) - (message "Passed Example 5.16 p. 352") + (message "Passed Example 5.15 p. 351 and 5.16 p. 352") - ;; TODO Make this pass (parser-generator-set-eof-identifier '$) (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 2) @@ -224,25 +207,66 @@ ) ) (parser-generator-process-grammar) - (let* ((tables - (parser-generator-ll--generate-tables)) ;; TODO Replace with hard-coded value here - (parser-tables - (parser-generator-ll--generate-parsing-table - tables))) - (message "parser-tables: %S" parser-tables) + (let ((parser-tables + (parser-generator-ll--generate-parsing-table + (parser-generator-ll--generate-tables)))) + ;; (message "parser-tables: %S" parser-tables) (should (equal '( ( - ((S) nil) + ((S) ($)) ;; T0 + ( + ((a b) reduce (a b ((A) ($))) 1) + (($ $) reduce (e) 0) + ) + ) + ( + ((A) ($)) ;; T1 + ( + ((b $) reduce (b) 3) + ((a a) reduce (((S) (a a)) a a) 2) + ((a b) reduce (((S) (a a)) a a) 2) + ) + ) + ( + ((S) (a a)) ;; T2 + ( + ((a a) reduce (e) 0) + ((a b) reduce (a b ((A) (a a))) 1) + ) + ) + ( + ((A) (a a)) ;; T3 + ( + ((b a) reduce (b) 3) + ((a a) reduce (((S) (a a)) a a) 2) + ((a b) reduce (((S) (a a)) a a) 2) + ) + ) + ( + b + ( + ((b b) pop) + ((b a) pop) + ((b $) pop) + ) + ) + ( + a ( - ((a b) reduce () - ) + ((a b) pop) + ((a a) pop) + ((a $) pop) ) ) + ( + $ + (($ $) accept) + ) ) parser-tables))) - (message "Passed example 5.17 p. 354") + (message "Passed example 5.17 p. 356") (message "Passed tests for (parser-generator-ll--generate-parsing-table)"))