branch: externals/parser-generator commit 8092c58162baa44133ff78cf40a1069d35e80d76 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added global declaration to unit test --- test/parser-generator-lr-test.el | 51 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 3277b3e..b5d1513 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -489,7 +489,8 @@ (setq parser-generator--e-identifier '%empty) - (parser-generator-set-look-ahead-number 1) + (parser-generator-set-look-ahead-number + 1) (parser-generator-set-grammar '( (start input line exp) @@ -535,13 +536,57 @@ token)))) (setq parser-generator-lex-analyzer--get-function - (lambda (token) - (car token))) + (lambda (token) (car token))) + (parser-generator-process-grammar) (should-error (parser-generator-lr-generate-parser-tables)) (message "Grammar caused expected error") + ;; Add precedence to resolve conflicts + (setq + parser-generator--context-sensitive-attributes + '(%prec)) + (setq + parser-generator--global-attributes + '(%left %precedence %right)) + (setq + parser-generator--global-declaration + '( + (%left "-" "+") + (%left "*" "/") + (%precedence NEG) + (%right "^") + )) + (parser-generator-set-grammar + '( + (start input line exp) + ("+" "-" "*" "/" "^" "(" ")" "\n" NUM) + ( + (start input) + (input + %empty + (input line)) + (line + "\n" + (exp "+" (lambda(args) (message "%s" args)))) + (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))))) + start)) + (parser-generator-process-grammar) + + ;; TODO Should work now + (parser-generator-lr-generate-parser-tables) + (message "Grammar now passes thanks to precedence rules") + + ;; TODO Test functionality here (then move to translate test) (let ((buffer (generate-new-buffer "*buffer*"))) (switch-to-buffer buffer) (kill-region (point-min) (point-max))