Show
Ignore:
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • hh2008/hayamiz/trunk/hascheme/parser.scm

    r23 r15  
    66(define-class <ast> () ()) 
    77(define-class <ast-decl> (<ast>) ()) 
    8 (define-class <ast-decls> (<ast>) 
    9   ((delcs :init-keyword :decls :getter decls))) 
    108(define-class <ast-type-decl> (<ast-decl>) 
    119  ((left :init-keyword :left :getter type-decl-left) 
     
    1614(define-class <ast-single-type> (<ast-type>) 
    1715  ((type-name :init-keyword :name :getter type-name) 
    18    (type-arity :init-keyword :arity :accessor type-arity :init-value #f) 
     16   (type-arity :init-keyword :arity :accessor type-arity) 
    1917   (type-vars :init-keyword :vars :accessor type-vars :init-value #f) 
    2018   (type-module :init-keyword :module :getter type-module :init-value #f))) 
    2119(define-class <ast-multi-type> (<ast-type>) 
    2220  ((types :init-keyword :name :accessor types))) 
    23 (define-class <ast-simple-type> (<ast>) 
    24   ((type-name :init-keyword :name :getter type-name) 
    25    (type-vars :init-keyword :vars :getter type-vars))) 
    26  
     21(define-class <ast-simple-type> (<ast>) ()) 
    2722(define-method make-type-decl ((left <ast-simple-type>) (right <ast-type>)) 
    28   (make <ast-type-decl> :left left :right right)) 
     23  ; (make <type-decl> :left left :right right) 
     24  `(:type-decl ,left ,right)) 
    2925 
    3026(define (hascheme:parse str) 
     
    3632    (Body <- "{" (:decls TopDecls) "}" :return decls) 
    3733    (TopDecls <- Spaces* (:decl TopDecl) (:rest-decls TopDecls%) Spaces* 
    38               :return (make <ast-decls> :decls (cons decl rest-decls)) 
     34              :return `(:decls ,decl ,@rest-decls) 
    3935              / Spaces* :return ()) 
    4036    (TopDecls% <- Spaces* ";" Spaces* TopDecl TopDecls% 
     
    7975                ) 
    8076 
    81     (FuncApplyExpression  
    82      <- (:atom AtomExpression) 
    83      (:rest-atoms ((Spaces (:inatm AtomExpression) :return inatm) *)) 
    84      Spaces* :return `(:funapply ,atom ,@rest-atoms)) 
     77    (FuncApplyExpression <- AtomExpression +) 
    8578    (AtomExpression 
    8679     <- QVar 
     
    116109     / "~" Spaces* AtomPattern) 
    117110 
    118     (QVar <- LexQVarId 
    119           / "(" Spaces* (:sym LexQVarSym) Spaces* ")" :return sym) 
     111    (QVar <- LexQVarId / "(" Spaces* LexQVarSym Spaces* ")") 
    120112    (GCon <- "(" Spaces* ")" 
    121113          / "[" Spaces* "]" 
     
    130122           / LexQtyCls "(" LexTyVar AType + ")") 
    131123    (SimpleType <- (:con LexTyCon) (:vars SimpleTypeVars) 
    132                 :return (make <ast-simple-type> :name con :vars vars)) 
     124                :return `(:type-name ,con :vars ,vars)) 
    133125    (SimpleTypeVars <- Spaces (:var LexTyVar) (:vars SimpleTypeVars) 
    134126                    :return (cons var vars) 
    135127                    / :return ()) 
    136128    (Type <- (:type BType) Spaces* (:rest-types Type%) 
    137           :return 
    138           (if (null? rest-types) 
    139               type 
    140               (make <ast-multi-type> :types (cons type rest-types)))) 
     129          :return `(:type ,type ,@rest-types)) 
    141130    (Type% <- "->" Spaces* (:type Type) (:rest-types Type%) 
    142131           :return (cons type rest-types) 
    143132           / :return ()) 
    144133    (BType <- (:type AType) (:rest-types BType%)  
    145            :return (cond  
    146                     ((is-a? type <ast-single-type>) 
    147                      (begin (set! (type-vars type) rest-types) 
    148                             type)) 
    149                     ((and (is-a? #?=type <ast-multi-type>) 
    150                           (null? #?=rest-types)) 
    151                      type) 
    152                     (else (error "Type error")))) 
     134           :return (cons type rest-types)) 
    153135    (BType% <- Spaces (:type AType) (:rest-types BType%) 
    154136            :return (cons type rest-types) 
     
    158140           / "(" Spaces* (:t1 Type) Spaces* "," 
    159141           Spaces* (:t2 Type) Spaces* (:rest AType%) ")" 
    160            :return (make <ast-single-type> :name '$Tuple 
     142           :return (make <ast-simple-type> :name '$Tuple 
    161143                         :arity (+ 2 (length rest)) 
    162144                         :vars `(,t1 ,t2 ,@rest)) 
    163145           / "[" Spaces* Type Spaces* "]" 
    164            / "(" Spaces* (:t Type) Spaces* ")" :return t) 
     146           / "(" Spaces* Type Spaces* ")") 
    165147    (AType% <- "," Spaces* (:t Type) Spaces* (:rest AType%) 
    166148            :return (cons t rest) 
    167149            / :return ()) 
    168     (GtyCon <- (:tycon LexQtyCon) 
    169             :return (make <ast-single-type> :name (cadr tycon) 
    170                           :module (car tycon)) 
     150    (GtyCon <- LexQtyCon 
    171151            / "(" Spaces* ")" 
    172             :return (make <ast-single-type> :name '$Unit :arity 0) 
     152            :return (make <ast-single-type> :name '$Unit :arity 0 :vars ()) 
    173153            / "[" Spaces* "]" 
    174154            :return '(make <ast-single-type> :name '$Unit :arity 0) 
     
    224204    (LexQConSym <- (LexModId ".") ? LexConSym) 
    225205    (LexQtyCon <- (:mod ((LexModId ".") ?)) (:tycon LexTyCon) 
    226                :return (if mod `(,(car mod) ,tycon) 
    227                            `(#f ,tycon))) 
     206               :return (if mod `(:module ,(car mod) ,@tycon) 
     207                           `(:module #f ,@tycon))) 
    228208    (LexQtyCls <- (LexModId ".") ? LexTyCls) 
    229209    (LexGConSym <- ":" / LexQConSym ) 
     
    249229 
    250230 
    251 (define-method hascheme:ast-print ((ast <ast-decls>)) 
    252   (let1 ast-decls (decls ast) 
    253     (unless (null? ast-decls) 
    254       (hascheme:ast-print (car ast-decls)) 
    255       (unless (null? (cdr ast-decls)) 
    256         (display "; ") 
    257         (for-each hascheme:ast-print (cdr ast-decls)))))) 
    258  
    259 (define-method hascheme:ast-print ((ast <ast-type-decl>)) 
    260   (hascheme:ast-print (type-decl-left ast)) 
    261   (display " = ") 
    262   (hascheme:ast-print (type-decl-right ast))) 
    263  
    264 (define-method hascheme:ast-print ((ast <ast-simple-type>)) 
    265   (let1 vars (type-vars ast) 
    266     (cond 
    267      ((null? vars) (display (type-name ast))) 
    268      (else 
    269       (display (type-name ast)) 
    270       (for-each (lambda (sym) (format #t " ~a" sym)) 
    271                 vars))))) 
    272  
    273 (define-method hascheme:ast-print ((ast <ast-single-type>)) 
    274   (let1 vars (type-vars ast) 
    275     (cond 
    276      ((null? vars) (display (type-name ast))) 
    277      (else 
    278       (display (type-name ast)) 
    279       (for-each (lambda (var) 
    280                   (cond 
    281                    ((symbol? var) (format #t " ~a" var)) 
    282                    ((is-a? var <ast-type-var>) 
    283                     (display " ") 
    284                     (hascheme:ast-print var)) 
    285                    ((is-a? var <ast>) 
    286                     (display " (") 
    287                     (hascheme:ast-print var) 
    288                     (display ")")) 
    289                    (error "Invalid type"))) 
    290                 vars))))) 
    291  
    292 (define-method hascheme:ast-print ((ast <ast-type-var>)) 
    293   (display (type-var ast))) 
    294  
    295231(define (hascheme:parser-test) 
    296232  (test* "Simplest body" '(())