summaryrefslogtreecommitdiff
path: root/modules/language/python/module/string.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/string.scm')
-rw-r--r--modules/language/python/module/string.scm72
1 files changed, 51 insertions, 21 deletions
diff --git a/modules/language/python/module/string.scm b/modules/language/python/module/string.scm
index c99344c..9c0d818 100644
--- a/modules/language/python/module/string.scm
+++ b/modules/language/python/module/string.scm
@@ -9,7 +9,9 @@
#:use-module (language python for)
#:use-module (language python def)
#:use-module (language python string)
- #:use-module (parser stis-parser)
+ #:use-module (language python bytes)
+ #:use-module ((parser stis-parser) #:select (*whitespace* f-n f-m))
+ #:use-module (parser stis-parser lang python3 tool)
#:export (Formatter ascii_letters digits hexdigits))
(define digits "0123456789")
@@ -239,17 +241,27 @@
(f-cons argName (ff* (f-or! (f-list #:attr "." attributeName)
(f-list #:elem "[" elementIndex "]")))))
-(define replField
+(define (replField fieldName1)
(f-list
#:field
- (ff? (mk-token (f-scope fieldName )) None)
+ (ff? fieldName1 None)
(ff? (f-seq "!" (mk-token (f-scope conversion))) None)
(ff? (f-seq ":" (mk-token (f-scope formatSpec))) None)))
-(define tag (f-seq (f-tag "{") replField (f-tag "}")))
+(define (tag fieldName1)
+ (f-seq (f-tag "{") (replField fieldName1) (f-tag "}")))
+
(define nontag (f-list #:str
- (mk-token (f+ (f-or! (f-tag! "{{") (f-not! tag))))))
-(define e (f-seq (ff* (f-or! tag nontag)) f-eof))
+ (mk-token (f+
+ (f-or!
+ (f-tag! "{{")
+ (f-not! (tag (mk-token
+ (f-scope
+ fieldName)))))))))
+
+(define e (f-seq (ff* (f-or! (tag fieldName) nontag)) f-eof))
+
+(set! (@@ (parser stis-parser lang python3-parser) f-formatter) tag)
(define mk-gen
(make-generator (l)
@@ -293,24 +305,40 @@
(lam (self format_string (* args) (** kwargs))
((ref self 'vformat) format_string args kwargs)))
+ (define vformat2
+ (lambda (self fn2 co fo)
+ (if (and (eq? fo None) (eq? co None))
+ ((ref self 'convert_field) fn2 "r")
+ (let ((fn3 (if (eq? co None)
+ fn2
+ ((ref self 'convert_field)
+ fn2 co))))
+ (if (eq? fo None)
+ fn3
+ ((ref self 'format_field ) fn3 fo))))))
+
+ (define vformat1
+ (lambda (self s fn fo co ss args kwargs)
+ (if (eq? fn None)
+ (cons s ss)
+ (let* ((fn2 ((ref self 'get_field ) fn args kwargs))
+ (fn3 (if (and (eq? fo None) (eq? co None))
+ ((ref self 'convert_field) fn2 "r")
+ (let ((fn3 (if (eq? co None)
+ fn2
+ ((ref self 'convert_field)
+ fn2 co))))
+ (if (eq? fo None)
+ fn3
+ ((ref self 'format_field )
+ fn3 fo))))))
+ (cons* fn3 s ss)))))
+
(define vformat
(lambda (self format_string args kwargs)
(set self '_args '())
(for ((s fn fo co : ((ref self 'parse) format_string))) ((ss '("")))
- (if (eq? fn None)
- (cons s ss)
- (let* ((fn2 ((ref self 'get_field ) fn args kwargs))
- (fn3 (if (and (eq? fo None) (eq? co None))
- ((ref self 'convert_field) fn2 "r")
- (let ((fn3 (if (eq? co None)
- fn2
- ((ref self 'convert_field)
- fn2 co))))
- (if (eq? fo None)
- fn3
- ((ref self 'format_field )
- fn3 fo))))))
- (cons* fn3 s ss)))
+ (vformat self s fn fo co ss args kwargs)
#:final
(begin
((ref self 'check_unused_args) (ref self '_args) args kwargs)
@@ -376,4 +404,6 @@
(define (ascii x) (bytes x))
-(set! (@@ (language python string) formatter) (Formatter))
+(define formatter (Formatter))
+(set! (@@ (language python string) formatter) formatter)
+(set! (@@ (language python compile) formatter) (ref formatter 'vformat2))