[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 778b96f 335/434: More work on global p
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 778b96f 335/434: More work on global precedence declaration |
Date: |
Mon, 29 Nov 2021 16:00:10 -0500 (EST) |
branch: externals/parser-generator
commit 778b96facfd3c685182334990418fd725ab7a42e
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More work on global precedence declaration
---
parser-generator-lr.el | 87 ++++++++++++++++++++++++++++++++++------
test/parser-generator-lr-test.el | 15 +++++--
2 files changed, 87 insertions(+), 15 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 8df773c..59ea339 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -35,21 +35,84 @@
"Goto-tables for grammar.")
(defvar
- parser-generator-lr--precedence-attribute
+ parser-generator-lr--context-sensitive-precedence-attribute
nil
- "Attribute used for precedence.")
+ "Attribute used for context-sensitive-precedence.")
(defvar
- parser-generator-lr--precedence-comparison-function
+ parser-generator-lr--context-sensitive-precedence-comparison-function
nil
- "Function used for resolving precedence.")
+ "Function used for resolving context-sensitive precedence.")
+
+(defvar
+ parser-generator-lr--global-precedence-attribute-left
+ nil
+ "Global precedence attribute to left symbol.")
+
+(defvar
+ parser-generator-lr--global-precedence-attribute-right
+ nil
+ "Global precedence attribute to right symbol.")
+
+(defvar
+ parser-generator-lr--global-precedence-attribute-general
+ nil
+ "Global precedence attribute for general precedence.")
+
+(defvar
+ parser-generator-lr--global-precedence-table
+ nil
+ "Hash-table for fast look-up of global precedence symbols.")
;; Main Algorithms
+(defun parser-generator-lr--prepare-global-declaration ()
+ "Prepare global declaration for parsing."
+ (setq
+ parser-generator-lr--global-precedence-table
+ (make-hash-table :test 'equal))
+ (when (or
+ parser-generator-lr--global-precedence-attribute-left
+ parser-generator-lr--global-precedence-attribute-right
+ parser-generator-lr--global-precedence-attribute-general)
+ (let ((line-index 0))
+ (dolist (line parser-generator--global-declaration)
+ (let ((attribute (car line))
+ (items (cdr line)))
+ (cond
+ ((eq
+ attribute
+ parser-generator-lr--global-precedence-attribute-left)
+ (dolist (item items)
+ (puthash
+ item
+ `(left ,line-index)
+ parser-generator-lr--global-precedence-table)))
+ ((eq
+ attribute
+ parser-generator-lr--global-precedence-attribute-right)
+ (dolist (item items)
+ (puthash
+ item
+ `(right ,line-index)
+ parser-generator-lr--global-precedence-table)))
+ ((eq
+ attribute
+ parser-generator-lr--global-precedence-attribute-general)
+ (dolist (item items)
+ (puthash
+ item
+ `(general ,line-index)
+ parser-generator-lr--global-precedence-table)))))
+ (setq
+ line-index
+ (1+ line-index))))))
+
(defun parser-generator-lr-generate-parser-tables ()
"Generate parsing tables for grammar."
(message "\nStarting generation of parser-tables..\n")
+ (parser-generator-lr--prepare-global-declaration)
(let ((table-lr-items
(parser-generator-lr--generate-goto-tables)))
(parser-generator-lr--generate-action-tables
@@ -945,16 +1008,16 @@
(let ((a-value
(plist-get
(car (cdr a))
- parser-generator-lr--precedence-attribute))
+ parser-generator-lr--context-sensitive-precedence-attribute))
(b-value
(plist-get
(car (cdr b))
- parser-generator-lr--precedence-attribute)))
+ parser-generator-lr--context-sensitive-precedence-attribute)))
(condition-case
errors
(let ((comparison
(funcall
- parser-generator-lr--precedence-comparison-function
+
parser-generator-lr--context-sensitive-precedence-comparison-function
a-value
b-value)))
(setq
@@ -970,7 +1033,7 @@
(when
(plist-get
(car (cdr a))
- parser-generator-lr--precedence-attribute)
+ parser-generator-lr--context-sensitive-precedence-attribute)
(setq
takes-precedence
t)))
@@ -978,7 +1041,7 @@
(when
(plist-get
(car (cdr b))
- parser-generator-lr--precedence-attribute)
+ parser-generator-lr--context-sensitive-precedence-attribute)
(setq
takes-precedence
nil))))
@@ -989,10 +1052,10 @@
(let ((can-be-resolved))
(when
(and
- parser-generator-lr--precedence-attribute
- parser-generator-lr--precedence-comparison-function
+ parser-generator-lr--context-sensitive-precedence-attribute
+ parser-generator-lr--context-sensitive-precedence-comparison-function
(functionp
- parser-generator-lr--precedence-comparison-function)
+
parser-generator-lr--context-sensitive-precedence-comparison-function)
(or (listp a)
(listp b)))
(if
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index b5d1513..7bcd8f4 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -143,10 +143,10 @@
(message "Conflicted grammar caused expected exception 2")
(setq
- parser-generator-lr--precedence-attribute
+ parser-generator-lr--context-sensitive-precedence-attribute
'%prec)
(setq
- parser-generator-lr--precedence-comparison-function
+ parser-generator-lr--context-sensitive-precedence-comparison-function
#'>)
(parser-generator-lr-generate-parser-tables)
(message "Grammar not conflicting anymore")
@@ -545,6 +545,15 @@
;; 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
@@ -1346,7 +1355,7 @@
(defun parser-generator-lr-test ()
"Run test."
- ;; (setq debug-on-error t)
+ ;; (setq debug-on-error nil)
(parser-generator-lr-test--items-for-prefix)
(parser-generator-lr-test--items-valid-p)
- [elpa] externals/parser-generator 2481361 425/434: Improved readme, (continued)
- [elpa] externals/parser-generator 2481361 425/434: Improved readme, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e59baa8 416/434: Added move feature of lex-analyzer into exported LR lex-analyzer, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 29568c3 428/434: Added support for copyright text in exported LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4a3a51d 434/434: Added FSF copyright headers, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 24f3fb9 419/434: Lex-analyzer peek look-ahead does not affect global state, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f5a5801 421/434: Clarified lex-analyzer exporting necessities, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9a3240b 314/434: Fixed bug with error throwing on false lr item sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5f13406 319/434: More work on supporting LR-grammar with precedence attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 989e79e 331/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8092c58 334/434: Added global declaration to unit test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 778b96f 335/434: More work on global precedence declaration,
ELPA Syncer <=
- [elpa] externals/parser-generator 0523eeb 336/434: More work on global precedence, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0aed7b0 339/434: More work on global precedence in LR(k) parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b84ed5e 342/434: Fixed issue with infix calculator translation test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f449039 346/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 34f95b3 351/434: More debugging infix calculator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bb82646 356/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b040d9b 357/434: Tests for infix calculator working, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4404424 367/434: Added test for parsing context-sensitive attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2ad866c 371/434: Context-sensitive attribute are now tested through specified comparison function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9d5df0e 375/434: More working on trying to get the Infix example working, ELPA Syncer, 2021/11/29