emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/parser-generator 87435188dd 15/82: Added function to se


From: Christian Johansson
Subject: [elpa] externals/parser-generator 87435188dd 15/82: Added function to set EOF-identifier
Date: Thu, 12 May 2022 13:28:13 -0400 (EDT)

branch: externals/parser-generator
commit 87435188dd9471cae8dbb83fa9f3c2259f1a533d
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@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)
+            )
+           )
+        )
+      ))
 
     )
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]