Add Boucher's `lalr-scm' as the `(system base lalr)' module.
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-02.scm
diff --git a/test-suite/lalr/test-lr-associativity-02.scm b/test-suite/lalr/test-lr-associativity-02.scm
new file mode 100644 (file)
index 0000000..6fb62e7
--- /dev/null
@@ -0,0 +1,91 @@
+;;; test-lr-associativity-02.scm --
+;;
+;;Show  how  to use  left  and  right  associativity.  Notice  that  the
+;;terminal  M  is declared  as  left  associative;  this influences  the
+;;binding  of values to  the $n  symbols in  the semantic  clauses.  The
+;;semantic clause in the rule:
+;;
+;;  (E M E M E)     : (list $1 $2 (list $3 $4 $5))
+;;
+;;looks like  it is right-associated, but the  result is left-associated
+;;because we have declared M as "left:".
+;;
+
+(load "common-test.scm")
+
+(define (doit . tokens)
+  (let ((parser (lalr-parser
+                (expect: 0)
+                (N (left: A)
+                   (left: M)
+                   (nonassoc: U))
+                (E     (N)             : $1
+                       (E A E)         : (list $1 $2 $3)
+                       (E M E)         : (list $1 $2 $3)
+                       (E M E M E)     : (list $1 $2 (list $3 $4 $5))
+                       (A E (prec: U)) : (list '- $2)))))
+    (parser (make-lexer tokens) error-handler)))
+
+;;; --------------------------------------------------------------------
+;;; Single operator.
+
+(check
+    (doit (make-lexical-token 'N #f 1))
+  => 1)
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'A #f '+)
+         (make-lexical-token 'N #f 2))
+  => '(1 + 2))
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'M #f '*)
+         (make-lexical-token 'N #f 2))
+  => '(1 * 2))
+
+(check
+    (doit (make-lexical-token 'A #f '-)
+         (make-lexical-token 'N #f 1))
+  => '(- 1))
+
+;;; --------------------------------------------------------------------
+;;; Precedence.
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'A #f '+)
+         (make-lexical-token 'N #f 2)
+         (make-lexical-token 'M #f '*)
+         (make-lexical-token 'N #f 3))
+  => '(1 + (2 * 3)))
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'M #f '*)
+         (make-lexical-token 'N #f 2)
+         (make-lexical-token 'A #f '+)
+         (make-lexical-token 'N #f 3))
+  => '((1 * 2) + 3))
+
+;;; --------------------------------------------------------------------
+;;; Associativity.
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'A #f '+)
+         (make-lexical-token 'N #f 2)
+         (make-lexical-token 'A #f '+)
+         (make-lexical-token 'N #f 3))
+  => '((1 + 2) + 3))
+
+(check
+    (doit (make-lexical-token 'N #f 1)
+         (make-lexical-token 'M #f '*)
+         (make-lexical-token 'N #f 2)
+         (make-lexical-token 'M #f '*)
+         (make-lexical-token 'N #f 3))
+  => '((1 * 2) * 3))
+
+;;; end of file