[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator a8c092d 386/434: More work on preceden
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator a8c092d 386/434: More work on precedence logic |
Date: |
Mon, 29 Nov 2021 16:00:21 -0500 (EST) |
branch: externals/parser-generator
commit a8c092d0f91c61519270ededa2b3f78557a1a1b3
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More work on precedence logic
---
parser-generator-lr.el | 13 ++++++++----
test/parser-generator-lr-test.el | 43 ++++++++++++++++++++++++++++------------
2 files changed, 39 insertions(+), 17 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 68267f6..1919b35 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -1143,10 +1143,15 @@
b-production-number)
(progn
(unless
- (parser-generator-lr--action-takes-precedence-p
- a-follow
- a-production-number
- b-production-number)
+ (or
+ (parser-generator-lr--action-takes-precedence-p
+ a-follow
+ a-production-number
+ b-production-number)
+ (parser-generator-lr--action-takes-precedence-p
+ b-follow
+ b-production-number
+ a-production-number))
(when
signal-on-false
(error
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 677f92d..a9aed0f 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -220,6 +220,7 @@
(setq
parser-generator-lr--precedence-comparison-function
(lambda(a-type a-value b-type b-value)
+ (message "(parser-generator-lr--precedence-comparison-function %S %S %S
%S)" a-type a-value b-type b-value)
(cond
((and
@@ -249,8 +250,7 @@
((and
a-value
(not b-value))
- t))
- nil))
+ t))))
(parser-generator-lr-generate-parser-tables)
(should
(equal
@@ -357,6 +357,7 @@
symbol
(string-to-number symbol)))
symbol))))))
+
(setq
parser-generator-lr--global-precedence-attributes
nil)
@@ -396,7 +397,19 @@
("(" exp ")" (lambda(args) (nth 1 args)))))
start))
(parser-generator-process-grammar)
+
+ (should-error
+ (parser-generator-lr-generate-parser-tables))
+ (message "Grammar caused expected conflict 3")
+
+ (setq
+ parser-generator-lr--global-precedence-attributes
+ '(%left %precedence %right))
+ (setq
+ parser-generator-lr--context-sensitive-precedence-attribute
+ '%prec)
(parser-generator-lr-generate-parser-tables)
+ (message "Grammar not conflict anymore")
;; Parse: 1+1*2\n
;;
@@ -441,7 +454,7 @@
17
translate)))
(kill-buffer))
- (message "Passed correct precedence of 2+3*5 = 2+(3*5)")
+ (message "Passed correct precedence of 2+3*5 = 2+(3*5) = 17")
(let ((buffer (generate-new-buffer "*buffer*")))
(switch-to-buffer buffer)
@@ -457,13 +470,10 @@
16
translate)))
(kill-buffer))
- (message "Passed incorrect precedence of 2*3+5 => 2*(3+5)")
+ (message "Passed incorrect precedence of 2*3+5 => 2*(3+5) = 16")
;; Add global precedence, but it should not solve all errors
(setq
- parser-generator-lr--global-precedence-attributes
- '(%left %precedence %right))
- (setq
parser-generator--global-declaration
'(
(%left "-" "+")
@@ -472,21 +482,27 @@
(%right "^")))
(parser-generator-lr-generate-parser-tables)
- (let ((buffer (generate-new-buffer "*buffer*")))
+ (let ((buffer (generate-new-buffer "*buffer*")))
(switch-to-buffer buffer)
- (insert "2*3+5\n")
- (let ((parse (parser-generator-lr-parse)))
+ (insert "2+3*5\n")
+ (let ((translate (parser-generator-lr-translate)))
(should
(equal
- '(1 5 5 5 8 6 4 2)
- parse)))
+ 17
+ translate)))
+ (kill-buffer))
+ (message "Passed correct precedence of 2+3*5 => 2+(3*5) = 17")
+
+ (let ((buffer (generate-new-buffer "*buffer*")))
+ (switch-to-buffer buffer)
+ (insert "2*3+5\n")
(let ((translate (parser-generator-lr-translate)))
(should
(equal
11
translate)))
(kill-buffer))
- (message "Passed correct precedence of 2*3+5 => (2*3)+5")
+ (message "Passed correct precedence of 2*3+5 => (2*3)+5 = 11")
;; Add context-sensitive precedence that should solve cases of -X
(setq
@@ -1625,6 +1641,7 @@
(defun parser-generator-lr-test ()
"Run test."
;; (setq debug-on-error nil)
+ ;; (setq debug-on-signal nil)
(parser-generator-lr-test--items-for-prefix)
(parser-generator-lr-test--items-valid-p)
- [elpa] externals/parser-generator bff0e63 380/434: Added TODO note, (continued)
- [elpa] externals/parser-generator bff0e63 380/434: Added TODO note, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 97b5e59 381/434: Comparing precedence of last symbol of production with look-ahead, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5ff13d2 382/434: Improvements in test for precedence, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9c30f34 385/434: More work on refactoring conflict resolution, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 53fb785 395/434: Verified examples in documentation, added infix notation calculator example, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e447145 402/434: Added notes about setting to allow default conflict resolution, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 201bcb1 405/434: Improved notes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator aad1a17 404/434: Removed unnecessary logic in LR(0) action-table generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1b2a150 403/434: Added failing test for e-identifier in the middle of a rule, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator aa8a2bf 391/434: Work on the tests for the exported lr-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a8c092d 386/434: More work on precedence logic,
ELPA Syncer <=
- [elpa] externals/parser-generator 7a3e653 390/434: Added test for testing precedence of context-sensitive attribute, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5cb63eb 399/434: Improve error message of invalid global declaration, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f9223ea 400/434: Added a flag to use shift conflict resolution in cases were precedence is missing, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ded7700 387/434: Added more test for infix precedence, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9e8b89b 392/434: More work on exporting LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fc48311 409/434: Added test for FIRST calculation of multiple symbols and e-identifiers, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 6733b57 415/434: Added feature to move lex-analyzer forward, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9eca533 410/434: Added test and implementation of calculating FIRST on multiple symbols were first is a non-terminal that expands into an e-identifier, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ca21bcd 412/434: Shortened doc-string, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0a3f5f5 426/434: Added test for LR(1) PHP 8.0 match grammar, ELPA Syncer, 2021/11/29