Module: dfmc-macro-expander Synopsis: Hacks to convert emulator flavour templates to compiler template description objects. Bootstrapping only. Author: Keith Playford Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define macro token-converter-definer { define token-converter ?:name => ?class:name, ?stuff; } => { define method convert-template-token (type == ?#"name", value) make(?class, record: #f, source-position: #f, ?stuff) end method; } { define token-converter ?:token => ?class:name, ?stuff; } => { define method convert-template-token (type == ?token, value) make(?class, record: #f, source-position: #f, ?stuff) end method; } end macro; define token-converter => , name: value; define token-converter => , name: value; define token-converter => , name: value; define token-converter => , name: value; define token-converter => , name: value; define token-converter => , value: value; define token-converter => , value: value; define token-converter => , value: value; define token-converter => ; define token-converter => ; define token-converter => , name: #"=="; define token-converter => , name: #"-"; define token-converter => , name: #":="; define token-converter => , name: value; define token-converter => , name: value; define token-converter => , name: #"~"; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter => ; define token-converter &next: => ; define token-converter &rest: => ; define token-converter &key: => ; define token-converter &all-keys: => ; define token-converter parsed-literal: => , value: value; define method convert-template (contents) if (empty?(contents)) #() else let type = contents.first; if (keyword?(type) & ~member?(type, #(&next:, &rest:, &key:, &all-keys:, parsed-literal:))) let value = make(, record: #f, source-position: #f, name: as(, as(, type))); pair(value, convert-template(contents.tail.tail)); elseif (object-class(type) == ) let value = contents.second; pair(convert-template-token(type, value), convert-template(contents.tail.tail)); else pair(convert-template-substitution(type), convert-template(contents.tail)); end; end; end method; //// Substitution conversion. define macro hack-import-definer { define hack-import ?names end } => { ?names } names: { } => { } { ?:name, ... } => { define constant "old/" ## ?name = access(infix-reader, ?name); ... } end macro; define hack-import , name, , separator, , pattern, before, after, , , , token-value, , expression, end; define method convert-template-substitution (subst :: old/) make(, variable-name: make-old-expression(subst.old/name)) end method; define method convert-template-substitution (subst :: old/) make(, variable-name: make-old-expression(subst.old/expression)) end method; define method convert-template-substitution (subst :: old/) make(, variable-name: make-old-expression(subst.old/name.old/name)) end method; define method convert-template-substitution (subst :: old/) make(, variable-name: make-old-expression(subst.old/name.old/name)) end method; define method convert-template-substitution (subst :: old/) let old-sep = subst.old/separator; make(, variable-name: make-old-expression(subst.old/name), separator: old-sep & apply(convert-template-token, old-sep)); end method; define method convert-template-substitution (subst :: old/) make(, variable-name: #f, name-substitution: convert-template-substitution(subst.old/pattern), prefix: subst.old/before | "", suffix: subst.old/after | ""); end method; //// Hax. // For some reason this seems to be needed when compiling macros loaded // from a database. I don't understand it, but it works. -gz, 4/12/97 define method fragment-name (f :: old/) old/token-value(f) end method; define constant reparse = access(infix-reader, reparse); define constant fragments = access(infix-reader, fragments); define constant as-fragment = access(infix-reader, as-fragment); define constant = access(infix-reader, ); define method as-fragment (c :: ) c end method; define method fragments (c :: ) c end; // eof