[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 3170e8d 370/434: Context-sensitive pre
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 3170e8d 370/434: Context-sensitive precedence now avoids conflict-detection |
Date: |
Mon, 29 Nov 2021 16:00:18 -0500 (EST) |
branch: externals/parser-generator
commit 3170e8d988200b20f600923adaff6e1feb81ab95
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Context-sensitive precedence now avoids conflict-detection
---
parser-generator-lr.el | 92 ++++++++++++++++++++++++++--------------
parser-generator.el | 17 ++++++--
test/parser-generator-lr-test.el | 7 +--
test/parser-generator-test.el | 4 +-
4 files changed, 77 insertions(+), 43 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 6727751..82f96f1 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -867,7 +867,6 @@
(b-follow)
(b-suffix-follow)
(b-suffix-follow-eff)
- (b-suffix-follow-eff-item)
(b-index 0)
(b-production)
(b-production-number))
@@ -956,29 +955,23 @@
(parser-generator--e-free-first
b-suffix-follow))
- ;; If b is at a point of reduction,
- ;; calculate production and production-number
- (if (not b-suffix)
- (progn
- (setq
- b-production
- (list
- (nth 0 b)
- (nth 1 b)))
- (setq
- b-production-number
- (parser-generator--get-grammar-production-number
- b-production)))
- (setq
- b-production
- nil)
- (setq
- b-production-number
- nil))
+ (let ((b-lhs)
+ (b-rhs))
+ (if (listp (nth 0 b))
+ (setq b-lhs (nth 0 b))
+ (setq b-lhs (list (nth 0 b))))
+ (if (nth 2 b)
+ (setq b-rhs (append (nth 1 b) (nth 2 b)))
+ (setq b-rhs (nth 1 b)))
+ (setq b-production (list b-lhs b-rhs)))
+ (setq
+ b-production-number
+ (parser-generator--get-grammar-production-number
+ b-production))
(parser-generator--debug
(message "b-production: %S" b-production)
- (message "b-production-number: %S" b-production)
+ (message "b-production-number: %S" b-production-number)
(message "b-suffix: %s" b-suffix)
(message "b-follow: %s" b-follow)
(message "b-suffix-follow: %s" b-suffix-follow)
@@ -1119,16 +1112,53 @@
(let ((can-be-resolved))
(when
;; Precedence comparison function exists?
- ;; (and
- ;; parser-generator-lr--precedence-comparison-function
- ;; (functionp
- ;; parser-generator-lr--precedence-comparison-function)
- ;; parser-generator-lr--global-precedence-attributes
- ;; (or
- ;; (gethash
- ;; symbol
- ;; parser-generator-lr--global-precedence-table)
- can-be-resolved)))
+ (and
+ parser-generator-lr--precedence-comparison-function
+ (functionp
+ parser-generator-lr--precedence-comparison-function)
+ parser-generator-lr--global-precedence-attributes
+ parser-generator-lr--context-sensitive-precedence-attribute)
+
+ ;; Try to find precedence data for A
+ (when a-production-number
+ (let ((a-attributes
+ (gethash
+ a-production-number
+ parser-generator--table-productions-attributes)))
+ (when a-attributes
+ (let ((a-attribute-value
+ (plist-get
+ a-attributes
+
parser-generator-lr--context-sensitive-precedence-attribute)))
+ (when a-attribute-value
+ (let ((a-precedence
+ (gethash
+ a-attribute-value
+ parser-generator-lr--global-precedence-table)))
+ (when a-attribute-value
+ (setq can-be-resolved t))))))))
+
+ ;; Try to find precedence data for B
+ (when (and
+ (not can-be-resolved)
+ b-production-number)
+ (let ((b-attributes
+ (gethash
+ b-production-number
+ parser-generator--table-productions-attributes)))
+ (when b-attributes
+ (let ((b-attribute-value
+ (plist-get
+ b-attributes
+
parser-generator-lr--context-sensitive-precedence-attribute)))
+ (when b-attribute-value
+ (let ((b-precedence
+ (gethash
+ b-attribute-value
+ parser-generator-lr--global-precedence-table)))
+ (when b-precedence
+ (setq can-be-resolved t)))))))))
+ can-be-resolved))
;; Algorithm 5.8, p. 386
(defun parser-generator-lr--items-for-prefix (γ)
diff --git a/parser-generator.el b/parser-generator.el
index e0b8f4f..f92cb19 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -17,7 +17,7 @@
(defvar
parser-generator--debug
- t
+ nil
"Whether to print debug messages or not.")
(defvar
@@ -553,9 +553,18 @@
(nth
(1+ sub-rhs-element-index)
rhs-element)))
- (push
- `(,sub-rhs-element ,attribute-value)
- production-attributes)
+ (if production-attributes
+ (setq
+ production-attributes
+ (append
+ production-attributes
+ sub-rhs-element
+ attribute-value))
+ (setq
+ production-attributes
+ (list
+ sub-rhs-element
+ attribute-value)))
(setq
sub-rhs-element-index
(1+ sub-rhs-element-index))))
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index df403af..b1eb75a 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -164,13 +164,8 @@
t)
(t
nil))))
- ;; TODO Should add tests for
(parser-generator-lr--prepare-global-declaration)
- (parser-generator-lr--prepare-global-declaration)
- (message "parser-generator-lr--global-precedence-attributes-table: %S"
parser-generator-lr--global-precedence-attributes-table)
- (message "parser-generator-lr--global-precedence-attributes: %S"
parser-generator-lr--global-precedence-attributes)
- (message "parser-generator-lr--global-precedence-table: %S"
parser-generator-lr--global-precedence-table)
+
(parser-generator-lr-generate-parser-tables)
-
(message "Grammar not conflicting anymore")
(let ((table-lr-items
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 7e9a996..6d48d88 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -480,7 +480,7 @@
(should
(equal
- '((%prec 1))
+ '(%prec 1)
(parser-generator--get-grammar-context-sensitive-attributes-by-production-number
0)))
(should
(equal
@@ -488,7 +488,7 @@
(parser-generator--get-grammar-production-by-number 0)))
(should
(equal
- '((%prec D))
+ '(%prec D)
(parser-generator--get-grammar-context-sensitive-attributes-by-production-number
1)))
(should
(equal
- [elpa] externals/parser-generator f371e2d 320/434: Added failing test for conflict, (continued)
- [elpa] externals/parser-generator f371e2d 320/434: Added failing test for conflict, ELPA Syncer, 2021/11/29
- [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 <=
- [elpa] externals/parser-generator 1be5fda 374/434: More work on support for conflict resolution, ELPA Syncer, 2021/11/29
- [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