]> gitweb.factorcode.org Git - factor.git/commitdiff
alien.parser, alien.syntax: refactor ENUM: to separate parsing from definition
authorJoe Groff <arcata@gmail.com>
Tue, 13 Apr 2010 04:42:48 +0000 (21:42 -0700)
committerErik Charlebois <erikcharlebois@gmail.com>
Tue, 20 Apr 2010 03:07:17 +0000 (20:07 -0700)
basis/alien/parser/parser.factor
basis/alien/syntax/syntax.factor

index 1db4ca5cd866073630da92c5a5dac872900e874f..63f5043eeb200b71a55aa07039c8182d38b8c7ac 100755 (executable)
@@ -75,19 +75,28 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
     "*" ?head
     [ [ <pointer> ] dip parse-pointers ] when ;
 
+: next-enum-member ( members name value -- members value' )
+    [ 2array suffix! ] [ 1 + ] bi ;
+
 PRIVATE>
 
-: define-enum-member ( word-string value -- next-value )
-     [ create-in ] dip [ define-constant ] keep 1 + ;
+: define-enum-member ( name value -- )
+    [ create-in ] [ define-constant ] bi* ;
+
+: define-enum-members ( members -- )
+    [ first2 define-enum-member ] each ;
+
+: parse-enum-member ( members name value -- members value' )
+    over "{" =
+    [ 2drop scan scan-object next-enum-member "}" expect ]
+    [ next-enum-member ] if ;
 
-: parse-enum-member ( word-string value -- next-value )
-     over "{" =
-     [ 2drop scan scan-object define-enum-member "}" expect ]
-     [ define-enum-member ] if ;
+: parse-enum-members ( members counter -- members )
+    scan dup ";" = not
+    [ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
 
-: parse-enum-members ( counter -- )
-     scan dup ";" = not
-     [ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
+: define-enum ( word members -- )
+    [ int swap typedef ] [ define-enum-members ] bi* ;
 
 : scan-function-name ( -- return function )
     scan-c-type scan parse-pointers ;
index b6cb4af8f60edd7358cd70e57c2c68ee04bee493..c69a9b8ebe4611e9b7982ff454830db0b8a40c2f 100755 (executable)
@@ -30,9 +30,9 @@ SYNTAX: TYPEDEF:
 
 SYNTAX: ENUM:
     scan dup "f" =
-    [ drop ]
-    [ (CREATE-C-TYPE) dup save-location int swap typedef ] if
-    0 parse-enum-members ;
+    [ drop ]
+    [ (CREATE-C-TYPE) dup save-location ] if
+    V{ } clone 0 parse-enum-members define-enum ;
 
 SYNTAX: C-TYPE:
     void CREATE-C-TYPE typedef ;