[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 1be5fda 374/434: More work on support
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 1be5fda 374/434: More work on support for conflict resolution |
Date: |
Mon, 29 Nov 2021 16:00:19 -0500 (EST) |
branch: externals/parser-generator
commit 1be5fdaa6d03f8b5967802d15ad528aa68a118cf
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More work on support for conflict resolution
---
parser-generator-lr.el | 57 ++++++++++++++++++++++++----------------
test/parser-generator-lr-test.el | 37 ++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 22 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 3d45306..52d4c57 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -396,7 +396,9 @@
index-hash-key
index-symbols)
(if
-
parser-generator-lr--precedence-comparison-function
+ (and
+
parser-generator-lr--precedence-comparison-function
+
parser-generator-lr--global-precedence-table)
(let ((a u)
(b
(gethash
@@ -407,9 +409,10 @@
;; and production-number of B
;; if it's a reduction
(if
-
(parser-generator-lr--production-takes-precedence-p
- (car (cdr a))
- (car (cdr b)))
+
(parser-generator-lr--reduce-takes-precedence-p
+ (car u)
+ production-number
+ (nth 2 b))
(progn
(parser-generator--debug
(message
@@ -444,7 +447,7 @@
index-hash-key
index-symbols)))
(error
- "Reduce/%S conflict for %S in state
%S, %S vs %S"
+ "Reduce/%S conflict for %S in state
%S"
(car (cdr conflicted-item))
u
goto-index
@@ -1029,11 +1032,18 @@
(setq set-index (1+ set-index)))
valid-p))
-(defun parser-generator-lr--production-takes-precedence-p (a-production-number
b-production-number)
- "Return t if A-PRODUCTION-NUMBER takes precedence over B-PRODUCTION-NUMBER,
otherwise nil."
- (let ((a-precedence-value)
+(defun parser-generator-lr--reduce-takes-precedence-p (symbol
a-production-number &optional b-production-number)
+ "Return t if reduction of SYMBOL at A-PRODUCTION-NUMBER takes precedence
over other action. If other action is a reduction then it is at
B-PRODUCTION-NUMBER."
+ (let ((a-precedence-value
+ (gethash
+ symbol
+ parser-generator-lr--global-precedence-table))
(b-precedence-value))
+ (message "parser-generator-lr--reduce-takes-precedence-p: %S %S %S" symbol
a-production-number b-production-number)
+ (message "a-precedence-value: %S from %S" a-precedence-value
parser-generator-lr--global-precedence-table)
+ ;; Context-sensitive precedence takes precedence over
+ ;; global precedence
(let ((a-attributes
(gethash
a-production-number
@@ -1050,21 +1060,24 @@
a-precedence-symbol
parser-generator-lr--global-precedence-table))))))
- (let ((b-attributes
- (gethash
- b-production-number
- parser-generator--table-productions-attributes)))
- (when b-attributes
- (let ((b-precedence-symbol
- (plist-get
- b-attributes
- parser-generator-lr--context-sensitive-precedence-attribute)))
- (when b-precedence-symbol
- (setq
- b-precedence-value
+ (when b-production-number
+ (let ((b-attributes
(gethash
- b-precedence-symbol
- parser-generator-lr--global-precedence-table))))))
+ b-production-number
+ parser-generator--table-productions-attributes)))
+ (when b-attributes
+ (let ((b-precedence-symbol
+ (plist-get
+ b-attributes
+
parser-generator-lr--context-sensitive-precedence-attribute)))
+ (when b-precedence-symbol
+ (setq
+ b-precedence-value
+ (gethash
+ b-precedence-symbol
+ parser-generator-lr--global-precedence-table)))))))
+
+ ;; TODO Need to pass action type of A and B to comparison function
(funcall
parser-generator-lr--precedence-comparison-function
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 9aeb979..d10240c 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -634,6 +634,43 @@
(setq
parser-generator--context-sensitive-attributes
'(%prec))
+ (setq
+ parser-generator-lr--precedence-comparison-function
+ (lambda(a b)
+ (if (and
+ (not a)
+ (not b))
+ nil
+ (let ((a-precedence)
+ (b-precedence))
+ (when a
+ (setq
+ a-precedence
+ (plist-get
+ a
+ '%precedence)))
+ (when b
+ (setq
+ b-precedence
+ (plist-get
+ b
+ '%precedence)))
+ (cond
+ ((and
+ a-precedence
+ (not b-precedence))
+ t)
+ ((and
+ b-precedence
+ (not a-precedence))
+ nil)
+ ((and
+ a-precedence
+ b-precedence)
+ (>
+ a-precedence
+ b-precedence))
+ (t nil))))))
(parser-generator-set-grammar
'(
(start input line exp)
- [elpa] externals/parser-generator 2eadec5 326/434: Shortened long doc comments, (continued)
- [elpa] externals/parser-generator 2eadec5 326/434: Shortened long doc comments, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 43f3bd4 332/434: Fixed issue were non-terminals named as emacs-lisp functions was not accepted in grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8165c55 333/434: Conflicting grammar causes expected error, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator feaa9ff 338/434: Removed debug outputs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cf01b59 341/434: Fixed action-table generation with symbols with context-sensitive attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ae18945 353/434: Passing some calculations thanks to precedence / associativity, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fce14ea 355/434: Fixed bug with context-sensitive attributes being lost in LR-item generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2592481 361/434: Added TODO notes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 18b2f7b 365/434: Added context-sensitive precedence to infix example, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3170e8d 370/434: Context-sensitive precedence now avoids conflict-detection, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1be5fda 374/434: More work on support for conflict resolution,
ELPA Syncer <=
- [elpa] externals/parser-generator 8e462cf 378/434: Validated generated action and goto-tables after precedence modification, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 6a7343e 383/434: Started on refactoring precedence table generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8013f69 384/434: Unit tests for testing precedence table generation now passes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e070522 396/434: Fixed broken link in documentation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5b95baf 401/434: More work on last feature, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4da88bf 406/434: Added another test for e-identifier in middle of rule, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 72796d0 408/434: Fixed bug with FIRST calculation with multiple symbols and e-identifiers, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 843bc57 398/434: Fixed invalid reference to parser-generator to fetch translation by production number, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7eb8cab 397/434: Small fixes to documentation about syntax analysis, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3a178ed 393/434: Exported LR parser now passes all tests, ELPA Syncer, 2021/11/29