1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators combinators.short-circuit
4 generalizations kernel locals math.order ranges
5 sequences.parser sequences sequences.generalizations
6 sorting.functor sorting.slots unicode ;
9 : take-c-comment ( sequence-parser -- seq/f )
11 dup "/*" take-sequence [
12 "*/" take-until-sequence*
16 ] with-sequence-parser ;
18 : take-c++-comment ( sequence-parser -- seq/f )
20 dup "//" take-sequence [
23 { [ current CHAR: \n = ] [ sequence-parse-end? ] } 1||
31 ] with-sequence-parser ;
33 : skip-whitespace/comments ( sequence-parser -- sequence-parser )
36 { [ dup take-c-comment ] [ skip-whitespace/comments ] }
37 { [ dup take-c++-comment ] [ skip-whitespace/comments ] }
41 : take-define-identifier ( sequence-parser -- string )
42 skip-whitespace/comments
43 [ current { [ blank? ] [ CHAR: ( = ] } 1|| ] take-until ;
45 :: take-quoted-string ( sequence-parser escape-char quote-char -- string )
46 sequence-parser n>> :> start-n
47 sequence-parser advance
50 [ { [ previous escape-char = ] [ current quote-char = ] } 1&& ]
51 [ current quote-char = not ]
53 ] take-while :> string
54 sequence-parser current quote-char = [
55 sequence-parser advance* string
57 start-n sequence-parser n<< f
60 : (take-token) ( sequence-parser -- string )
61 skip-whitespace [ current { [ blank? ] [ f = ] } 1|| ] take-until ;
63 :: take-token* ( sequence-parser escape-char quote-char -- string/f )
64 sequence-parser skip-whitespace
66 { quote-char [ escape-char quote-char take-quoted-string ] }
71 : take-token ( sequence-parser -- string/f )
72 CHAR: \ CHAR: \" take-token* ;
74 : c-identifier-begin? ( ch -- ? )
75 CHAR: a CHAR: z [a..b]
76 CHAR: A CHAR: Z [a..b]
77 { CHAR: _ } 3append member? ;
79 : c-identifier-ch? ( ch -- ? )
80 CHAR: a CHAR: z [a..b]
81 CHAR: A CHAR: Z [a..b]
82 CHAR: 0 CHAR: 9 [a..b]
83 { CHAR: _ } 4 nappend member? ;
85 : (take-c-identifier) ( sequence-parser -- string/f )
86 dup current c-identifier-begin? [
87 [ current c-identifier-ch? ] take-while
92 : take-c-identifier ( sequence-parser -- string/f )
93 [ (take-c-identifier) ] with-sequence-parser ;
95 << "length" [ length ] define-sorting >>
97 : sort-tokens ( seq -- seq' )
98 { length>=< <=> } sort-by ;
100 : take-c-integer ( sequence-parser -- string/f )
104 { "ull" "uLL" "Ull" "ULL" "ll" "LL" "l" "L" "u" "U" }
105 take-longest [ append ] when*
109 ] with-sequence-parser ;
111 CONSTANT: c-punctuators
113 "[" "]" "(" ")" "{" "}" "." "->"
114 "++" "--" "&" "*" "+" "-" "~" "!"
115 "/" "%" "<<" ">>" "<" ">" "<=" ">=" "==" "!=" "^" "|" "&&" "||"
117 "=" "*=" "/=" "%=" "+=" "-=" "<<=" ">>=" "&=" "^=" "|="
119 "<:" ":>" "<%" "%>" "%:" "%:%:"
122 : take-c-punctuator ( sequence-parser -- string/f )
123 c-punctuators take-longest ;