1 ! Copyright (C) 2009 Doug Coleman.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators combinators.short-circuit kernel
4 math.order ranges sequences sequences.generalizations
5 sequences.parser sorting.functor sorting.slots unicode ;
8 : take-c-comment ( sequence-parser -- seq/f )
10 dup "/*" take-sequence [
11 "*/" take-until-sequence*
15 ] with-sequence-parser ;
17 : take-c++-comment ( sequence-parser -- seq/f )
19 dup "//" take-sequence [
22 { [ current CHAR: \n = ] [ sequence-parse-end? ] } 1||
30 ] with-sequence-parser ;
32 : skip-whitespace/comments ( sequence-parser -- sequence-parser )
35 { [ dup take-c-comment ] [ skip-whitespace/comments ] }
36 { [ dup take-c++-comment ] [ skip-whitespace/comments ] }
40 : take-define-identifier ( sequence-parser -- string )
41 skip-whitespace/comments
42 [ current { [ blank? ] [ CHAR: ( = ] } 1|| ] take-until ;
44 :: take-quoted-string ( sequence-parser escape-char quote-char -- string )
45 sequence-parser n>> :> start-n
46 sequence-parser advance
49 [ { [ previous escape-char = ] [ current quote-char = ] } 1&& ]
50 [ current quote-char = not ]
52 ] take-while :> string
53 sequence-parser current quote-char = [
54 sequence-parser advance* string
56 start-n sequence-parser n<< f
59 : (take-token) ( sequence-parser -- string )
60 skip-whitespace [ current { [ blank? ] [ f = ] } 1|| ] take-until ;
62 :: take-token* ( sequence-parser escape-char quote-char -- string/f )
63 sequence-parser skip-whitespace
65 { quote-char [ escape-char quote-char take-quoted-string ] }
70 : take-token ( sequence-parser -- string/f )
71 CHAR: \ CHAR: \" take-token* ;
73 : c-identifier-begin? ( ch -- ? )
74 CHAR: a CHAR: z [a..b]
75 CHAR: A CHAR: Z [a..b]
76 { CHAR: _ } 3append member? ;
78 : c-identifier-ch? ( ch -- ? )
79 CHAR: a CHAR: z [a..b]
80 CHAR: A CHAR: Z [a..b]
81 CHAR: 0 CHAR: 9 [a..b]
82 { CHAR: _ } 4 nappend member? ;
84 : (take-c-identifier) ( sequence-parser -- string/f )
85 dup current c-identifier-begin? [
86 [ current c-identifier-ch? ] take-while
91 : take-c-identifier ( sequence-parser -- string/f )
92 [ (take-c-identifier) ] with-sequence-parser ;
94 << "length" [ length ] define-sorting >>
96 : sort-tokens ( seq -- seq' )
97 { length>=< <=> } sort-by ;
99 : take-c-integer ( sequence-parser -- string/f )
103 { "ull" "uLL" "Ull" "ULL" "ll" "LL" "l" "L" "u" "U" }
104 take-longest [ append ] when*
108 ] with-sequence-parser ;
110 CONSTANT: c-punctuators
112 "[" "]" "(" ")" "{" "}" "." "->"
113 "++" "--" "&" "*" "+" "-" "~" "!"
114 "/" "%" "<<" ">>" "<" ">" "<=" ">=" "==" "!=" "^" "|" "&&" "||"
116 "=" "*=" "/=" "%=" "+=" "-=" "<<=" ">>=" "&=" "^=" "|="
118 "<:" ":>" "<%" "%>" "%:" "%:%:"
121 : take-c-punctuator ( sequence-parser -- string/f )
122 c-punctuators take-longest ;