branch: externals/parser-generator commit 928b31de59e3ead86ac6d4faf9f0a05e857b020f Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More work on infix calculator --- test/parser-generator-lr-test.el | 79 ++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 4b4b9ce..b99a894 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -518,7 +518,7 @@ (input line)) (line "\n" - (exp "+" (lambda(args) (message "%s" args)))) + (exp "\n")) (exp NUM (exp "+" exp (lambda(args) (+ (nth 0 args) (nth 2 args)))) @@ -534,29 +534,46 @@ (lambda (index) (with-current-buffer "*buffer*" (let ((token)) - (goto-char index) - (cond - ((looking-at "[0-9]+") - (setq - token - `(NUM ,(match-beginning 0) ,(match-end 0)))) - ((looking-at "\\(\\+\\|\-\\|\*\\|\/\\|\\^\\|)\\|(\\|\n\\)") - (let ((symbol - (buffer-substring-no-properties - (match-beginning 0) - (match-end 0)))) + (when + (< + index + (point-max)) + (goto-char + index) + (cond + ((looking-at "[0-9]+") (setq token - `(,symbol ,(match-beginning 0) . ,(match-end 0))))) - (t (error "Unexpected input at %d!" index))) + `(NUM ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "\\(\\+\\|\-\\|\*\\|\/\\|\\^\\|)\\|(\\|\n\\)") + (let ((symbol + (buffer-substring-no-properties + (match-beginning 0) + (match-end 0)))) + (setq + token + `(,symbol ,(match-beginning 0) . ,(match-end 0))))) + (t (error "Unexpected input at %d!" index)))) token)))) (setq parser-generator-lex-analyzer--get-function - (lambda (token) (car token))) + (lambda (token) + (with-current-buffer "*buffer*" + (let ((start (car (cdr token))) + (end (cdr (cdr token)))) + (when (<= end (point-max)) + (let ((symbol + (buffer-substring-no-properties start end))) + (when + (string-match-p "^[0-9]+$" symbol) + (setq + symbol + (string-to-number symbol))) + symbol)))))) (parser-generator-process-grammar) - (should-error - (parser-generator-lr-generate-parser-tables)) + ;; (should-error + ;; (parser-generator-lr-generate-parser-tables)) (message "Infix calculator grammar caused expected error") ;; Add precedence to resolve conflicts @@ -627,16 +644,16 @@ (input line)) (line "\n" - (exp "+" (lambda(args) (message "%s" args)))) + (exp "\n")) (exp NUM - (exp "+" exp (lambda(args) (+ (nth 0 args) (nth 2 args)))) - (exp "-" exp (lambda(args) (- (nth 0 args) (nth 2 args)))) - (exp "*" exp (lambda(args) (* (nth 0 args) (nth 2 args)))) - (exp "/" exp (lambda(args) (/ (nth 0 args) (nth 2 args)))) - ("-" (exp (%prec NEG)) (lambda(args) (- (nth 1 args)))) - (exp "^" exp (lambda(args) (expt (nth 0 args) (nth 2 args)))) - ("(" exp ")" (lambda(args) (nth 1))))) + (exp "+" exp (lambda(args) (+ (car (nth 0 args)) (car (nth 2 args))))) + (exp "-" exp (lambda(args) (- (car (nth 0 args)) (car (nth 2 args))))) + (exp "*" exp (lambda(args) (* (car (nth 0 args)) (car (nth 2 args))))) + (exp "/" exp (lambda(args) (/ (car (nth 0 args)) (car (nth 2 args))))) + ("-" (exp (%prec NEG)) (lambda(args) (- (car (nth 1 args))))) + (exp "^" exp (lambda(args) (expt (car (nth 0 args)) (car (nth 2 args))))) + ("(" exp ")" (lambda(args) (car (nth 1 args)))))) start)) (parser-generator-process-grammar) @@ -648,11 +665,19 @@ (switch-to-buffer buffer) (kill-region (point-min) (point-max)) (insert "5+5\n") - (parser-generator-lr-translate) (should (equal 10 - (parser-generator-lr-translate)))) + (car (parser-generator-lr-translate)))) + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "7-3\n") + (should + (equal + 4 + (parser-generator-lr-translate))) + (kill-buffer)) (message "Passed tests for (parser-generator-lr--parse)"))