branch: externals/parser-generator commit e598f652a7c1951753724dfbe0ed61f105a5d2f4 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Made some more tests pass after lex-analyzer refactor --- parser-generator-lex-analyzer.el | 12 ++++----- parser-generator-lr-export.el | 31 +---------------------- parser-generator-lr.el | 54 ++++++++-------------------------------- test/parser-generator-lr-test.el | 22 +++++++++------- 4 files changed, 30 insertions(+), 89 deletions(-) diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el index 9f1ff4f4c7..74d9d95840 100644 --- a/parser-generator-lex-analyzer.el +++ b/parser-generator-lex-analyzer.el @@ -91,11 +91,11 @@ (defun parser-generator-lex-analyzer--peek-next-look-ahead () "Peek next look-ahead number of tokens via lex-analyzer." (unless parser-generator-lex-analyzer--index - (error "Missing lex-analyzer index!")) + (error "Missing lex-analyzer index when peeking!")) (unless parser-generator-lex-analyzer--function - (error "Missing lex-analyzer function!")) + (error "Missing lex-analyzer function when peeking!")) (unless parser-generator--look-ahead-number - (error "Missing look-ahead-number!")) + (error "Missing look-ahead-number when peeking!")) (let ((look-ahead) (look-ahead-length 0) (index parser-generator-lex-analyzer--index) @@ -151,11 +151,11 @@ (defun parser-generator-lex-analyzer--pop-token () "Pop next token via lex-analyzer." (unless parser-generator-lex-analyzer--index - (error "Missing lex-analyzer index!")) + (error "Missing lex-analyzer index when popping!")) (unless parser-generator-lex-analyzer--function - (error "Missing lex-analyzer function!")) + (error "Missing lex-analyzer function when popping!")) (unless parser-generator--look-ahead-number - (error "Missing look-ahead-number!")) + (error "Missing look-ahead-number when popping!")) (let ((continue t) (tokens)) (while continue diff --git a/parser-generator-lr-export.el b/parser-generator-lr-export.el index aa4a03ec0a..97df7f5361 100644 --- a/parser-generator-lr-export.el +++ b/parser-generator-lr-export.el @@ -499,35 +499,9 @@ (unless %s--distinct-goto-tables (error \"Missing distinct GOTO-tables for grammar!\")) - (let ((accept) - (pre-index 0)) + (let ((accept)) (while (not accept) - ;; Save history when index has changed to enable incremental parsing / translating - (when - (> - %s-lex-analyzer--index - pre-index) - ;; We make a copy of the hash-table here to avoid passing same - ;; hash-table every-time with pointer - (let ((translation-symbol-table-list)) - (maphash - (lambda (key value) - (push - `(,key ,value) - translation-symbol-table-list)) - translation-symbol-table) - (push - `(,%s-lex-analyzer--index - ,pushdown-list - ,output - ,translation - ,translation-symbol-table-list) - history) - (setq - pre-index - %s-lex-analyzer--index))) - ;; (1) The look-ahead string u, consisting of the next k input symbols, is determined. (let ((look-ahead (%s-lex-analyzer--peek-next-look-ahead)) @@ -563,9 +537,6 @@ namespace namespace namespace - namespace - namespace - namespace namespace)) (insert " diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 47c0baa3b3..0a7e1e2a6a 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -1680,17 +1680,15 @@ input-tape-index pushdown-list output - translation - history) - "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION and HISTORY." + translation) + "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION." (let ((result (parser-generator-lr--parse nil input-tape-index pushdown-list output - translation - history))) + translation))) (nth 0 result))) (defun parser-generator-lr-translate @@ -1698,17 +1696,15 @@ input-tape-index pushdown-list output - translation - history) - "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION and HISTORY." + translation) + "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION." (let ((result (parser-generator-lr--parse t input-tape-index pushdown-list output - translation - history))) + translation))) (nth 1 result))) ;; Algorithm 5.7, p. 375 @@ -1719,9 +1715,8 @@ pushdown-list output translation - translation-symbol-table-list - history) - "Perform a LR-parse via lex-analyzer, optionally PERFORM-SDT means to perform syntax-directed translation and optioanlly start at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION, TRANSLATION-SYMBOL-TABLE-LIST and HISTORY." + translation-symbol-table-list) + "Perform a LR-parse via lex-analyzer, optionally PERFORM-SDT means to perform syntax-directed translation and optioanlly start at INPUT-TAPE-INDEX with PUSHDOWN-LIST, OUTPUT, TRANSLATION, TRANSLATION-SYMBOL-TABLE-LIST." (unless input-tape-index (setq input-tape-index 1)) (unless pushdown-list @@ -1754,35 +1749,9 @@ (unless parser-generator-lr--distinct-goto-tables (error "Missing distinct GOTO-tables for grammar!")) - (let ((accept) - (pre-index 0)) + (let ((accept)) (while (not accept) - ;; Save history when index has changed to enable incremental parsing / translating - (when - (> - parser-generator-lex-analyzer--index - pre-index) - ;; We make a copy of the hash-table here to avoid passing same - ;; hash-table every-time with pointer - (let ((translation-symbol-table-list)) - (maphash - (lambda (key value) - (push - `(,key ,value) - translation-symbol-table-list)) - translation-symbol-table) - (push - `(,parser-generator-lex-analyzer--index - ,pushdown-list - ,output - ,translation - ,translation-symbol-table-list) - history) - (setq - pre-index - parser-generator-lex-analyzer--index))) - ;; (1) The look-ahead string u, consisting of the next k input symbols, is determined. (let ((look-ahead (parser-generator-lex-analyzer--peek-next-look-ahead)) @@ -2201,8 +2170,6 @@ "Parsed entire string without getting accepting! Output: %s" (reverse output)) (reverse output))))) - (when history - (setq history (reverse history))) (when output (setq output (reverse output))) (let ((translation-symbol-table-list)) @@ -2216,8 +2183,7 @@ (list output translation - translation-symbol-table-list - history)))) + translation-symbol-table-list)))) (provide 'parser-generator-lr) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 60b71a0a13..da5be50b33 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -186,7 +186,7 @@ (parser-generator-process-grammar) (should-error (parser-generator-lr-generate-parser-tables)) - (message "Conflicted grammar caused expected exception") + (message "Passed test conflicted grammar caused expected exception") (setq parser-generator--global-attributes @@ -215,7 +215,7 @@ (parser-generator-process-grammar) (should-error (parser-generator-lr-generate-parser-tables)) - (message "Conflicted grammar caused expected exception 2") + (message "Passed test conflicted grammar caused expected exception 2") (setq parser-generator-lr--context-sensitive-precedence-attribute @@ -265,7 +265,7 @@ (equal '((0 (((a) shift))) (1 (((c) shift))) (2 ((($) reduce 2))) (3 ((($) accept))) (4 (((b) shift))) (5 (((c) shift))) (6 ((($) reduce 4))) (7 ((($) reduce 1)))) (parser-generator-lr--get-expanded-action-tables))) - (message "Grammar not conflicting anymore solution #1") + (message "Passed test grammar not conflicting anymore solution #1") ;; Example parse "a b c" ;; stack: 0 @@ -301,7 +301,7 @@ (equal '((0 (((a) shift))) (1 (((c) shift))) (2 ((($) reduce 2))) (3 ((($) accept))) (4 (((b) shift))) (5 (((c) reduce 3))) (6 ((($) reduce 4))) (7 ((($) reduce 1)))) (parser-generator-lr--get-expanded-action-tables))) - (message "Grammar not conflicting anymore solution #2") + (message "Passed test grammar not conflicting anymore solution #2") ;; Example parse "a b c" ;; stack: 0 @@ -339,6 +339,9 @@ (cond ((looking-at "\\([0-9]+\\.[0-9]+\\|[0-9]+\\)") + (setq + new-index + (match-end 0)) (setq token `(NUM ,(match-beginning 0) . ,(match-end 0)))) @@ -353,8 +356,8 @@ (setq token `(,symbol ,(match-beginning 0) . ,(match-end 0))))) - (t (error "Unexpected input at %d!" index)))) - (list token nil new-index nil))))) + (t (error "Unexpected input at %d!" index))) + (list token nil new-index nil) ))))) (setq parser-generator-lex-analyzer--get-function @@ -414,7 +417,7 @@ (parser-generator-process-grammar) (should-error (parser-generator-lr-generate-parser-tables)) - (message "Grammar caused expected conflict 3") + (message "Passed test grammar caused expected conflict 3") (setq parser-generator-lr--global-precedence-attributes @@ -423,7 +426,7 @@ parser-generator-lr--context-sensitive-precedence-attribute '%prec) (parser-generator-lr-generate-parser-tables) - (message "Grammar not conflicting anymore") + (message "Passed test grammar not conflicting anymore") ;; Parse: 1+1*2\n ;; @@ -464,12 +467,13 @@ (equal '(1 5 5 5 8 6 4 2) parse))) + (message "Passed parse with correct precedence of 2+3*5 = 2+(3*5)") (let ((translate (parser-generator-lr-translate))) (should (equal 17.0 translate))) - (message "Passed correct precedence of 2+3*5 = 2+(3*5) = 17") + (message "Passed translation with correct precedence of 2+3*5 = 2+(3*5) = 17") (kill-region (point-min) (point-max)) (insert "2*3+5\n")