branch: externals/parser-generator commit 1f36aeafdd8eec7c15eac45bf4510775dc9c8dee Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Updated documentation with translate example for LL(1) grammar --- docs/Syntax-Analysis/LL1.md | 18 +++++++---- parser-generator-ll.el | 66 ++++++++++++++-------------------------- parser-generator.el | 2 +- test/parser-generator-ll-test.el | 2 +- 4 files changed, 37 insertions(+), 51 deletions(-) diff --git a/docs/Syntax-Analysis/LL1.md b/docs/Syntax-Analysis/LL1.md index 50c74d9650..741be84429 100644 --- a/docs/Syntax-Analysis/LL1.md +++ b/docs/Syntax-Analysis/LL1.md @@ -11,6 +11,7 @@ Perform a left-parse of input-stream. ```emacs-lisp (require 'parser-generator-ll) (require 'ert) + (parser-generator-set-eof-identifier '$) (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 1) @@ -19,8 +20,14 @@ Perform a left-parse of input-stream. (S A) (a b) ( - (S (a A S) b) - (A a (b S A)) + (S + (a A S (lambda(a b) (format "alfa %s %s" (nth 1 a) (nth 2 a)))) + (b (lambda(a b) "beta")) + ) + (A + (a (lambda(a b) "delta")) + (b S A (lambda(a b) (format "gamma %s %s" (nth 1 a) (nth 2 a)))) + ) ) S ) @@ -44,12 +51,11 @@ Perform a left-parse of input-stream. parser-generator-lex-analyzer--get-function (lambda (token) (car token))) -(parser-generator-ll-parse) (should (equal - '(0 3 1 2 1) ;; Example is indexed from 1 so that is why they have '(1 4 2 3 2) - (parser-generator-ll-parse))) -(message "Passed example 5.5 p. 340") + "beta" + (parser-generator-ll-translate))) +(message "Passed translation test 3") ``` ## Translate diff --git a/parser-generator-ll.el b/parser-generator-ll.el index 2012cfce19..72cf781191 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -345,27 +345,21 @@ ((parser-generator--valid-non-terminal-p rhs-item) - (let* ((non-terminal-value-list - (gethash rhs-item symbol-table)) - (non-terminal-value - (pop non-terminal-value-list))) + (let ((non-terminal-value + (gethash rhs-item symbol-table))) (push (car non-terminal-value) args-1) (push (car (cdr non-terminal-value)) - args-2) - (puthash - rhs-item - non-terminal-value-list - symbol-table))) + args-2))) ((parser-generator--valid-terminal-p rhs-item) (push (parser-generator-lex-analyzer--get-function (nth terminal-index terminals)) - args-1) + args-1) (push (nth terminal-index terminals) args-2) @@ -398,25 +392,18 @@ args-2))) (parser-generator--debug (message - "\ntranslation-symbol-table: %S = %S (processed)\n" + "\ntranslation-symbol-table: %S = %S (processed)\n" + production-lhs + partial-translation)) + (puthash production-lhs + (list + partial-translation + args-2) + symbol-table) + (setq + translation partial-translation)) - (let ((symbol-translations - (gethash - production-lhs - symbol-table))) - (push - (list - partial-translation - args-2) - symbol-translations) - (puthash - production-lhs - symbol-translations - symbol-table) - (setq - translation - partial-translation))) ;; When no translation is specified just use popped contents as translation (let ((partial-translation @@ -425,23 +412,16 @@ args-2))) (parser-generator--debug (message - "\ntranslation-symbol-table: %S = %S (generic)\n" + "\ntranslation-symbol-table: %S = %S (generic)\n" + production-lhs + partial-translation)) + (puthash production-lhs - partial-translation)) - (let ((symbol-translations - (gethash - production-lhs - symbol-table))) - (push - partial-translation - symbol-translations) - (puthash - production-lhs - symbol-translations - symbol-table) - (setq - translation - (car partial-translation))))) + partial-translation + symbol-table) + (setq + translation + (car partial-translation)))) translation)) diff --git a/parser-generator.el b/parser-generator.el index dfd698663e..4b749f7f31 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 e5cf346430..da731424ba 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -517,7 +517,7 @@ (car token))) (should (equal - "delta sven laval" + "beta" (parser-generator-ll-translate))) (message "Passed translation test 3")