[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 06bff4b 321/434: Improved validation o
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 06bff4b 321/434: Improved validation of conflict-resolution using attributes |
Date: |
Mon, 29 Nov 2021 16:00:07 -0500 (EST) |
branch: externals/parser-generator
commit 06bff4bfa6032c99162d2a68c140abad03a63089
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Improved validation of conflict-resolution using attributes
---
parser-generator-lr.el | 86 +++++++++++++++++++++++++++++++++-------
test/parser-generator-lr-test.el | 10 ++++-
2 files changed, 79 insertions(+), 17 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 5da6882..8741f4e 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -778,22 +778,11 @@
b-suffix-follow-eff-item)
;; If it's the same symbol but we have a precedence
- ;; attribute on any of them, or both, pass anyway
+ ;; attributes on any of them, or both, pass anyway
(unless
- (and
- parser-generator-lr--precedence-attribute
- parser-generator-lr--precedence-comparison-function
- (or
- (and
- (listp (car a-follow-full))
- (plist-get
- (car (cdr (car a-follow-full)))
- parser-generator-lr--precedence-attribute))
- (and
- (listp (car b-suffix-follow-eff-item-full))
- (plist-get
- (car (cdr (car b-suffix-follow-eff-item-full)))
- parser-generator-lr--precedence-attribute))))
+
(parser-generator-lr--conflict-can-be-resolved-by-attributes
+ (car a-follow-full)
+ (car b-suffix-follow-eff-item-full))
(when
signal-on-false
(error
@@ -812,6 +801,73 @@
valid-p))
+(defun parser-generator-lr--conflict-can-be-resolved-by-attributes (a b)
+ "Return whether a conflict between A and B can be resolved by attributes."
+ (let ((can-be-resolved nil))
+ (when
+ (and
+ parser-generator-lr--precedence-attribute
+ parser-generator-lr--precedence-comparison-function
+ (functionp
+ parser-generator-lr--precedence-comparison-function)
+ (or (listp a)
+ (listp b)))
+ (cond
+ ((and
+ (listp a)
+ (listp b))
+ (let ((a-value
+ (plist-get
+ (car (cdr a))
+ parser-generator-lr--precedence-attribute))
+ (b-value
+ (plist-get
+ (car (cdr b))
+ parser-generator-lr--precedence-attribute)))
+ (condition-case
+ errors
+ (let ((comparison1
+ (funcall
+ parser-generator-lr--precedence-comparison-function
+ a-value
+ b-value))
+ (comparison2
+ (funcall
+ parser-generator-lr--precedence-comparison-function
+ b-value
+ a-value)))
+ (unless
+ (eq
+ comparison1
+ comparison2)
+ (setq
+ can-be-resolved
+ t)))
+ (error
+ (error
+ "Trying to compare '%S' with '%S' resulted in error: '%S'!"
+ a-value
+ b-value
+ errors)))))
+ ((listp a)
+ (when
+ (plist-get
+ (car (cdr a))
+ parser-generator-lr--precedence-attribute)
+ (setq
+ can-be-resolved
+ t)))
+ ((listp b)
+ (when
+ (plist-get
+ (car (cdr b))
+ parser-generator-lr--precedence-attribute)
+ (setq
+ can-be-resolved
+ t)
+ ))))
+ can-be-resolved))
+
;; Algorithm 5.8, p. 386
(defun parser-generator-lr--items-for-prefix (γ)
"Calculate valid LR-items for the viable prefix Γ."
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 9aebd32..36e5b27 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -143,7 +143,7 @@
'%prec)
(setq
parser-generator-lr--precedence-comparison-function
- #'<)
+ #'>)
(parser-generator-lr-generate-parser-tables)
(message "Grammar not conflicting anymore")
@@ -163,7 +163,13 @@
"conflict-action-tables: %s"
(parser-generator-lr--get-expanded-action-tables))
(should
(equal
- '((0 (((a) shift))) (1 (((c) shift))) (2 ((($) reduce 2))) (3 ((($)
accept))) (4 (((b) shift))) (5 ((((c (%prec 1))) shift))) (6 ((($) reduce 1))))
+ '((0 (((a) shift)))
+ (1 (((c) shift)))
+ (2 ((($) reduce 2)))
+ (3 ((($) accept)))
+ (4 (((b) shift)))
+ (5 (((c) shift)))
+ (6 ((($) reduce 1))))
(parser-generator-lr--get-expanded-action-tables))))
(message "Passed tests for (parser-generator-lr--generate-action-tables)"))
- [elpa] externals/parser-generator 688e685 291/434: Lex-analyzer index is now buffer-local variable, (continued)
- [elpa] externals/parser-generator 688e685 291/434: Lex-analyzer index is now buffer-local variable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0702765 293/434: Added incremental unit test for exported parser/translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 552c0c5 304/434: Using better hash-key for goto-tables generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d0d3201 299/434: FIRST calculation now handles cyclic productions, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5145cda 306/434: Improved hash-key integrity for LRk Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2227cae 313/434: Moved validation of valid lr-item set to generation of goto-tables, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a86c658 305/434: Improved output, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator dcbbdee 315/434: Started on support for symbol attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0c1b8b6 316/434: Passing tests for symbol attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c886537 311/434: Using references for distinct goto-tables to optimize memory usage, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06bff4b 321/434: Improved validation of conflict-resolution using attributes,
ELPA Syncer <=
- [elpa] externals/parser-generator ea898ce 317/434: Fixed code-styling, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ae51103 323/434: Passing test for resolving conflict using precedence attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 35d6be3 327/434: Added TODO-items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4d60ed4 328/434: Added validation to context-sensitive attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ce9ae69 329/434: Improved comment, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b8a81c5 330/434: Added failing test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06d23f5 340/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f213255 348/434: Passed all old unit tests again after translation refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 886af5c 349/434: Uncommented export tests until refactor is ok, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 99aa5b6 350/434: Added more unit tests for calculator, ELPA Syncer, 2021/11/29