summaryrefslogtreecommitdiff
path: root/test-suite/lalr/test-glr-associativity.scm
diff options
context:
space:
mode:
Diffstat (limited to 'test-suite/lalr/test-glr-associativity.scm')
-rw-r--r--test-suite/lalr/test-glr-associativity.scm102
1 files changed, 102 insertions, 0 deletions
diff --git a/test-suite/lalr/test-glr-associativity.scm b/test-suite/lalr/test-glr-associativity.scm
new file mode 100644
index 000000000..6a5a5e25b
--- /dev/null
+++ b/test-suite/lalr/test-glr-associativity.scm
@@ -0,0 +1,102 @@
+;;; test-glr-associativity.scm
+;;
+;;With the GLR parser both the terminal precedence and the non-terminal
+;;associativity are not respected; rather they generate two child
+;;processes.
+;;
+
+(load "common-test.scm")
+
+(define parser
+ (lalr-parser
+ (driver: glr)
+ (expect: 0)
+
+ (N LPAREN RPAREN
+ (left: + -)
+ (right: * /)
+ (nonassoc: uminus))
+
+ (output (expr) : $1)
+ (expr (expr + expr) : (list $1 '+ $3)
+ (expr - expr) : (list $1 '- $3)
+ (expr * expr) : (list $1 '* $3)
+ (expr / expr) : (list $1 '/ $3)
+ (- expr (prec: uminus)) : (list '- $2)
+ (N) : $1
+ (LPAREN expr RPAREN) : $2)))
+
+(define (doit . tokens)
+ (parser (make-lexer tokens) error-handler))
+
+;;; --------------------------------------------------------------------
+
+;;Remember that the result of the GLR driver is a list of parses, not a
+;;single parse.
+
+(check
+ (doit (make-lexical-token 'N #f 1))
+ => '(1))
+
+(check
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '+ #f '+)
+ (make-lexical-token 'N #f 2))
+ => '((1 + 2)))
+
+(check
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '* #f '*)
+ (make-lexical-token 'N #f 2))
+ => '((1 * 2)))
+
+(check
+ (doit (make-lexical-token '- #f '-)
+ (make-lexical-token 'N #f 1))
+ => '((- 1)))
+
+(check
+ (doit (make-lexical-token '- #f '-)
+ (make-lexical-token '- #f '-)
+ (make-lexical-token 'N #f 1))
+ => '((- (- 1))))
+
+(check
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '+ #f '+)
+ (make-lexical-token '- #f '-)
+ (make-lexical-token 'N #f 2))
+ => '((1 + (- 2))))
+
+;;; --------------------------------------------------------------------
+
+(check
+ ;;left-associativity
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '+ #f '+)
+ (make-lexical-token 'N #f 2)
+ (make-lexical-token '+ #f '+)
+ (make-lexical-token 'N #f 3))
+ => '(((1 + 2) + 3)))
+
+(check
+ ;;right-associativity
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '* #f '*)
+ (make-lexical-token 'N #f 2)
+ (make-lexical-token '* #f '*)
+ (make-lexical-token 'N #f 3))
+ => '(((1 * 2) * 3)
+ (1 * (2 * 3))))
+
+(check
+ ;;precedence
+ (doit (make-lexical-token 'N #f 1)
+ (make-lexical-token '+ #f '+)
+ (make-lexical-token 'N #f 2)
+ (make-lexical-token '* #f '*)
+ (make-lexical-token 'N #f 3))
+ => '(((1 + 2) * 3)
+ (1 + (2 * 3))))
+
+;;; end of file