1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
32 :
33 : class CAnalyser extends Analyser {
34 :
35 :
36 :
37 : public function resetState()
38 : {
39 0 : parent::resetState();
40 0 : }
41 :
42 :
43 :
44 :
45 :
46 :
47 :
48 : public function process($tokens, $parser_file)
49 : {
50 3 : $this->setTokens($tokens);
51 :
52 :
53 3 : $this->setPos(0);
54 3 : while ($token = $this->getToken()) {
55 3 : switch ($token->getType()) {
56 3 : case TOKEN_COMMENT:
57 3 : case TOKEN_C_PREPROCESSOR:
58 0 : break;
59 :
60 3 : case TOKEN_DOCBLOCK:
61 0 : $parser_file->applyComment($token->getValue());
62 0 : break 2;
63 :
64 3 : default:
65 3 : break 2;
66 3 : }
67 0 : $this->movePosForward();
68 0 : }
69 :
70 :
71 3 : $this->setPos(0);
72 3 : while ($function_open_bracket = $this->findTokenForwards(TOKEN_OPEN_NORMAL_BRACKET)) {
73 3 : $open_bracket_pos = $this->getTokenPos();
74 3 : $this->setPos($open_bracket_pos);
75 :
76 3 : $parser_function = new ParserFunction();
77 3 : $parser_file->functions[] = $parser_function;
78 3 :
79 :
80 3 : $name = $this->findTokenBackwards(TOKEN_IDENTIFIER, array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
81 3 : if ($name == null) return false;
82 3 : $this->setPos($this->getTokenPos());
83 3 : $parser_function->name = $name->getValue();
84 :
85 :
86 3 : $return_type = '';
87 3 : $return = $this->findTokenBackwards(array(TOKEN_IDENTIFIER, TOKEN_ASTERIX, TOKEN_CONST), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
88 3 : $this->setPos($this->getTokenPos());
89 3 : while ($return != null) {
90 2 : $return_type = $return->getValue() . ' ' . $return_type;
91 :
92 2 : $return = $this->findTokenBackwards(array(TOKEN_IDENTIFIER, TOKEN_ASTERIX, TOKEN_CONST), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
93 2 : $this->setPos($this->getTokenPos());
94 2 : }
95 :
96 :
97 3 : if ($return_type == '') {
98 1 : $return_type = 'int';
99 1 : } else {
100 2 : $return_type = trim($return_type);
101 2 : $return_type = str_replace(' *', '*', $return_type);
102 : }
103 3 : $parser_function->returns[0] = new ParserReturn();
104 3 : $parser_function->returns[0]->type = $return_type;
105 :
106 :
107 3 : $reserved = $this->findTokenBackwards(array(TOKEN_RESERVED_WORD), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
108 :
109 3 : $this->setPos($this->getTokenPos());
110 3 : while ($reserved != null) {
111 1 : switch ($reserved->getValue()) {
112 1 : case 'static':
113 1 : $parser_function->static = true;
114 1 : break;
115 1 : }
116 :
117 1 : $reserved = $this->findTokenBackwards(array(TOKEN_RESERVED_WORD), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
118 1 : $this->setPos($this->getTokenPos());
119 1 : }
120 :
121 :
122 :
123 :
124 3 : $docblock = $this->findTokenBackwards(TOKEN_DOCBLOCK, array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
125 3 : if ($docblock != null) {
126 0 : $parser_function->applyComment($docblock->getValue());
127 0 : }
128 :
129 :
130 3 : $depth = 0;
131 : $find_types = array(
132 3 : TOKEN_OPEN_NORMAL_BRACKET,
133 3 : TOKEN_CLOSE_NORMAL_BRACKET,
134 3 : TOKEN_IDENTIFIER,
135 3 : TOKEN_COMMA,
136 3 : TOKEN_ASTERIX,
137 3 : TOKEN_CONST,
138 3 : );
139 3 : $token = $function_open_bracket;
140 3 : $this->setPos($open_bracket_pos);
141 3 : $arg_tokens = array();
142 3 : while ($token) {
143 3 : switch ($token->getType()) {
144 3 : case TOKEN_OPEN_NORMAL_BRACKET:
145 3 : $depth++;
146 3 : break;
147 :
148 3 : case TOKEN_CLOSE_NORMAL_BRACKET:
149 3 : $depth--;
150 3 : break;
151 :
152 2 : case TOKEN_IDENTIFIER:
153 2 : case TOKEN_ASTERIX:
154 2 : case TOKEN_CONST:
155 2 : $arg_tokens[] = $token->getValue();
156 2 : break;
157 :
158 1 : case TOKEN_COMMA:
159 1 : $arg = new ParserArgument();
160 1 : $parser_function->args[] = $arg;
161 1 : $arg->name = array_pop($arg_tokens);
162 :
163 1 : if (count($arg_tokens) == 0) {
164 1 : $arg->type = 'int';
165 1 : } else {
166 1 : $arg->type = trim(implode(' ', $arg_tokens));
167 1 : $arg->type = str_replace(' *', '*', $arg->type);
168 : }
169 :
170 1 : $arg_tokens = array();
171 1 : break;
172 3 : }
173 :
174 3 : if ($depth == 0) break;
175 :
176 3 : $token = $this->findTokenForwards($find_types);
177 3 : $this->setPos($this->getTokenPos());
178 3 : }
179 :
180 :
181 3 : if (count($arg_tokens) > 0) {
182 2 : $arg = new ParserArgument();
183 2 : $parser_function->args[] = $arg;
184 2 : $arg->name = array_pop($arg_tokens);
185 :
186 2 : if (count($arg_tokens) == 0) {
187 1 : $arg->type = 'int';
188 1 : } else {
189 1 : $arg->type = trim(implode(' ', $arg_tokens));
190 1 : $arg->type = str_replace(' *', '*', $arg->type);
191 : }
192 2 : }
193 :
194 :
195 3 : $depth = 0;
196 3 : $token = $this->findTokenForwards(array(TOKEN_OPEN_CURLY_BRACKET, TOKEN_SEMICOLON));
197 3 : $this->setPos($this->getTokenPos());
198 3 : while ($token) {
199 3 : if ($token->getType() == TOKEN_OPEN_CURLY_BRACKET) $depth++;
200 3 : if ($token->getType() == TOKEN_CLOSE_CURLY_BRACKET) $depth--;
201 :
202 3 : if ($depth == 0) break;
203 :
204 3 : $token = $this->findTokenForwards(array(TOKEN_OPEN_CURLY_BRACKET, TOKEN_CLOSE_CURLY_BRACKET));
205 3 : $this->setPos($this->getTokenPos());
206 3 : }
207 :
208 3 : $parser_function->post_load();
209 3 : }
210 3 : }
211 :
212 :
213 : }
|