branch: externals/parser-generator commit 87435188dd9471cae8dbb83fa9f3c2259f1a533d Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added function to set EOF-identifier --- parser-generator-ll.el | 17 ++++++++++++++++- parser-generator.el | 8 ++++++++ test/parser-generator-ll-test.el | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index e6b24069a8..8bf2e6c7fd 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -225,7 +225,22 @@ ;; Algorithm 5.3 p. 351 (defun parser-generator-ll--generate-parsing-table (tables) "Generate a parsing table for an LL(k) grammar G and TABLES. Output M, a valid parsing table for G." - nil) + (let ((parsing-table)) + + ;; (2) M(a, av) = pop for all v in E where |E| = k-1 + + ;; (3) M($, e) = accept + (push + `(,parser-generator--eof-identifier + ( + ,(parser-generator--generate-list-of-symbol + parser-generator--look-ahead-number + parser-generator--eof-identifier) + accept) + ) + parsing-table) + + parsing-table)) ;; TODO diff --git a/parser-generator.el b/parser-generator.el index 67f35c455b..76847aca49 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -662,6 +662,14 @@ (error "E-identifier must be a symbol or string!")) (setq parser-generator--e-identifier e-identifier)) +(defun parser-generator-set-eof-identifier (eof-identifier) + "Set EOF-IDENTIFIER." + (unless (or + (stringp eof-identifier) + (symbolp eof-identifier)) + (error "EOF-identifier must be a symbol or string!")) + (setq parser-generator--eof-identifier eof-identifier)) + (defun parser-generator-set-look-ahead-number (k) "Set look-ahead number K." (unless (parser-generator--valid-look-ahead-number-p k) diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 9d8aeb7479..d908336717 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -51,6 +51,9 @@ "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) (let* ((tables '( (0 (((S) nil (a b) (a A a a)) ((S) nil (a a) (a A a a)) ((S) nil (b b) (b A b a)))) @@ -62,6 +65,43 @@ (message "parser-tables: %S" parser-tables) ;; TODO Add test here + (should + (equal + '( + (T0 ( + ((a a) reduce (a T1 a a) 1) + ((a b) reduce (a T1 a a) 1) + ((b b) reduce (b T2 b a) 2) + ) + ) + (T1 ( + ((a a) reduce (e) 4) + ((b a) reduce (b) 3) + ) + ) + (T2 ( + ((b a) reduce (e) 4) + ((b b) reduce (b) 3) + ) + ) + (a ( + ((a a) pop) + ((a b) pop) + ((a $) pop) + ) + ) + (b ( + ((b a) pop) + ((b b) pop) + ((b $) pop) + ) + ) + ($ ( + (($ $) accept) + ) + ) + ) + )) )