branch: externals/parser-generator
commit 0aed7b0511f55fc743c69da558302525d4419fc2
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
More work on global precedence in LR(k) parser
---
parser-generator-lr.el | 28 +++++++--------------
test/parser-generator-lr-test.el | 53 ++++++++++++++++++++++++++++++++--------
2 files changed, 52 insertions(+), 29 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index d4603ea..5163b2d 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -1009,24 +1009,24 @@
(if
(listp a)
(setq
- a-precendence
+ a-precedence
(gethash
(car a)
parser-generator-lr--global-precedence-table))
(setq
- a-precendence
+ a-precedence
(gethash
a
parser-generator-lr--global-precedence-table)))
(if
(listp b)
(setq
- b-precendence
+ b-precedence
(gethash
(car b)
parser-generator-lr--global-precedence-table))
(setq
- b-precendence
+ b-precedence
(gethash
b
parser-generator-lr--global-precedence-table)))
@@ -1094,26 +1094,16 @@
(parser-generator-lr--symbol-takes-precedence-p
a
b)
- (if
- (parser-generator-lr--symbol-takes-precedence-p
- b
- a)
- (setq
- can-be-resolved
- nil)
- (setq
- can-be-resolved
- t))
- (if
+ (setq
+ can-be-resolved
+ t)
+ (when
(parser-generator-lr--symbol-takes-precedence-p
b
a)
(setq
can-be-resolved
- t)
- (setq
- can-be-resolved
- nil))))
+ t))))
can-be-resolved))
;; Algorithm 5.8, p. 386
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 4ca05a8..7b9d8dd 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -557,25 +557,58 @@
(parser-generator-process-grammar)
(should-error
(parser-generator-lr-generate-parser-tables))
- (message "Grammar caused expected error")
+ (message "Infix calculator grammar caused expected error")
;; Add precedence to resolve conflicts
(setq
- parser-generator-lr--global-precedence-attribute-left
- '%left)
- (setq
- parser-generator-lr--global-precedence-attribute-right
- '%right)
- (setq
- parser-generator-lr--global-precedence-attribute-general
- '%precedence)
- (setq
parser-generator--context-sensitive-attributes
'(%prec))
(setq
parser-generator--global-attributes
'(%left %precedence %right))
(setq
+ parser-generator-lr--global-precedence-attributes
+ '(%left %precedence %right))
+ (setq
+ parser-generator-lr--context-sensitive-precedence-attribute
+ '%prec)
+ (setq
+ parser-generator-lr--precedence-comparison-function
+ (lambda(a b)
+ (cond
+ ((and a b)
+ (let ((a-op (car a))
+ (a-value (car (cdr a)))
+ (b-op (car b))
+ (b-value (car (cdr b))))
+ (cond
+ ((>= a-value b-value)
+ (cond
+ ((eq a-op '%left)
+ t)
+ ((eq a-op '%right)
+ nil)
+ ((eq a-op '%precedence)
+ t)))
+ ((> b-value a-value)
+ (cond
+ ((eq b-op '%left)
+ nil)
+ ((eq b-op '%right)
+ t)
+ ((eq b-op '%precedence)
+ nil))))))
+ (a
+ (cond
+ ((eq (car a) '%left)
+ t)
+ ((eq (car a) '%right)
+ nil)
+ ((eq (car a) '%precedence)
+ t)))
+ (t
+ nil))))
+ (setq
parser-generator--global-declaration
'(
(%left "-" "+")