diff options
Diffstat (limited to 'modules/language/python/module/string.scm')
-rw-r--r-- | modules/language/python/module/string.scm | 72 |
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)) |