branch: externals/parser-generator commit 173fe946dd398f38378830b9c88b08623f573af4 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Preparations for translation --- parser-generator-lr.el | 14 +++++++++++--- parser-generator.el | 6 ++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 4447d81..e12b139 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -604,15 +604,23 @@ (let ((production-number (car (cdr action-match)))) (let ((production (parser-generator--get-grammar-production-by-number production-number))) (let ((production-lhs (car production)) - (production-rhs (car (cdr production)))) + (production-rhs (car (cdr production))) + (popped-items-contents)) (unless (equal production-rhs (list parser-generator--e-identifier)) (let ((pop-items (* 2 (length production-rhs))) - (popped-items 0)) + (popped-items 0) + (popped-item)) (while (< popped-items pop-items) - (pop pushdown-list) + (setq popped-item (pop pushdown-list)) + (when (listp popped-item) + (push popped-item popped-items-contents)) (setq popped-items (1+ popped-items))))) (push production-number output) + (when (parser-generator--get-grammar-translation-by-number production-number) + ;; TODO Perform translation here + (message "Popped-items: %s" popped-items-contents)) + (let ((new-table-index (car pushdown-list))) (let ((goto-table (gethash new-table-index parser-generator-lr--goto-tables))) (let ((goto-table-length (length goto-table)) diff --git a/parser-generator.el b/parser-generator.el index 27c522b..c151273 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -201,6 +201,12 @@ (error "No grammar G defined!"))) (nth 1 G)) +(defun parser-generator--get-grammar-translation-by-number (production-number) + "If translation for PRODUCTION-NUMBER exist, return it." + (unless parser-generator--table-translations + (error "Table for translations by production-number is undefined!")) + (gethash production-number parser-generator--table-translations)) + (defun parser-generator--hash-to-list (hash-table &optional un-sorted) "Return a list that represent the HASH-TABLE. Each element is a list: (list key value), optionally UN-SORTED." (let (result)