branch: externals/parser-generator
commit cf42e67d02ee9d83a275ed6f7c436e1d777a4412
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Exported parser passes test
---
parser-generator-lr.el | 120 +++++++++++++++++++++++++++++----------
test/parser-generator-lr-test.el | 16 +++++-
2 files changed, 105 insertions(+), 31 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 75c86d2..ce22b64 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -195,14 +195,14 @@
"(defun
%s-lex-analyzer--get-function (token)
\"Get information about TOKEN.\"
- (unless
+ (unless
%s-lex-analyzer--get-function
(error \"Missing lex-analyzer get function!\"))
(let ((meta-information))
- (condition-case
+ (condition-case
error
(progn
- (setq
+ (setq
meta-information
(funcall
%s-lex-analyzer--get-function
@@ -211,7 +211,7 @@
namespace
namespace))
(insert "
- (error
+ (error
(error
\"Lex-analyze failed to get token meta-data of %s, error: %s\"
token
@@ -227,12 +227,12 @@
%s-lex-analyzer--reset
()
\"Reset Lex-Analyzer.\"
- (setq
- %s-lex-analyzer--index
+ (setq
+ %s-lex-analyzer--index
1)
- (when
+ (when
%s-lex-analyzer--reset-function
- (funcall
+ (funcall
%s-lex-analyzer--reset-function)))\n"
namespace
namespace
@@ -291,7 +291,7 @@
;; Lex-Analyzer Pop Token
(insert
(format "
-(defun
+(defun
%s-lex-analyzer--pop-token ()
\"Pop next token via lex-analyzer.\"
(let ((iteration 0)
@@ -336,15 +336,15 @@
\"If PRODUCTION-NUMBER exist, return it's production.\"
(gethash
production-number
- %s--table-productions-number-reverse))\n\n"
+ %s--table-productions-number-reverse))\n"
namespace
namespace))
;; Valid symbol p
(insert
(format "
-(defun
- %s--valid-symbol-p
+(defun
+ %s--valid-symbol-p
(symbol)
\"Return whether SYMBOL is valid or not.\"
(let ((is-valid t))
@@ -354,7 +354,7 @@
(%s--valid-non-terminal-p symbol)
(%s--valid-terminal-p symbol))
(setq is-valid nil))
- is-valid))\n\n"
+ is-valid))\n"
namespace
namespace
namespace
@@ -364,53 +364,70 @@
;; Valid e-p
(insert
(format "
-(defun
+(defun
%s--valid-e-p
(symbol)
\"Return whether SYMBOL is the e identifier or not.\"
(eq
symbol
- %s--e-identifier))\n\n"
+ %s--e-identifier))\n"
namespace
namespace))
;; Valid EOF-p
(insert
(format "
-(defun
+(defun
%s--valid-eof-p
(symbol)
\"Return whether SYMBOL is the EOF identifier or not.\"
- (eq
- symbol
- %s--eof-identifier))\n\n"
+ (eq
+ symbol
+ %s--eof-identifier))\n"
namespace
namespace))
- ;; TODO --valid-non-terminal-p
- ;; TODO --valid-terminal-p
+ ;; Valid non-terminal-p
+ (insert
+ (format "
+(defun %s--valid-non-terminal-p (symbol)
+ \"Return whether SYMBOL is a non-terminal in grammar or not.\"
+ (gethash
+ symbol
+ %s--table-non-terminal-p))\n"
+ namespace
+ namespace))
+
+ ;; Valid terminal-p
+ (insert
+ (format "
+(defun %s--valid-terminal-p (symbol)
+ \"Return whether SYMBOL is a terminal in grammar or not.\"
+ (gethash
+ symbol
+ %s--table-terminal-p))\n"
+ namespace
+ namespace))
;; Get grammar translation by number
(insert
(format "
-(defun
+(defun
%s--get-grammar-translation-by-number
(production-number)
\"If translation for PRODUCTION-NUMBER exist, return it.\"
- (gethash
- production-number
- %s--table-translations))\n\n"
+ (gethash
+ production-number
+ %s--table-translations))\n"
namespace
namespace))
- ;; TODO Add simple parse and translate function
-
;; Parse / translate function
(insert
(format "
-(defun
+(defun
%s--parse
- (&optional
+ (&optional
input-tape-index
pushdown-list
output
@@ -761,8 +778,51 @@
output
translation
translation-symbol-table
- history)))\n\n")
+ history)))\n")
+ ;; Parse
+ (insert
+ (format "
+(defun %s-parse
+ (&optional
+ input-tape-index
+ pushdown-list
+ output
+ translation
+ history)
+ \"Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with
PUSHDOWN-LIST, OUTPUT, TRANSLATION and HISTORY.\"
+ (let ((result
+ (%s--parse
+ input-tape-index
+ pushdown-list
+ output
+ translation
+ history)))
+ (nth 0 result)))\n"
+ namespace
+ namespace))
+
+ ;; Translate
+ (insert
+ (format "
+(defun %s-translate
+ (&optional
+ input-tape-index
+ pushdown-list
+ output
+ translation
+ history)
+ \"Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with
PUSHDOWN-LIST, OUTPUT, TRANSLATION and HISTORY.\"
+ (let ((result
+ (%s--parse
+ input-tape-index
+ pushdown-list
+ output
+ translation
+ history)))
+ (nth 1 result)))\n"
+ namespace
+ namespace))
;; Footer
(insert
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 704790f..0882a3f 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -1183,7 +1183,21 @@
'(2 2 2 1 1)
(parser-generator-lr-parse)))
(let ((export (parser-generator-lr--export-parser "e--")))
- (message "export:\n%s\n" export))
+
+ (with-temp-buffer
+ (insert export)
+ (eval-buffer)
+ (should
+ (equal
+ t
+ (fboundp 'e---parse)))
+
+ (when (fboundp 'e---parse)
+ (should
+ (equal
+ '(2 2 2 1 1)
+ (e---parse))))
+ (message "Passed parse for exported parser")))
(message "Passed tests for (parser-generator-lr--export-parser)"))