summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHartmut Holzgraefe <hholzgra@php.net>2003-06-21 19:28:19 +0000
committerHartmut Holzgraefe <hholzgra@php.net>2003-06-21 19:28:19 +0000
commitba8e371db1fdd31f88700d3464df7c331389326d (patch)
tree1b67167af382b3f65082c8a40a7dfe4c570358c8
parent7319c5132bc3e35a4311235950e441046184cc95 (diff)
downloadphp-git-ba8e371db1fdd31f88700d3464df7c331389326d.tar.gz
thoughts about a new proto parser ...
-rw-r--r--scripts/ext_skel_ng/php_function.php51
1 files changed, 49 insertions, 2 deletions
diff --git a/scripts/ext_skel_ng/php_function.php b/scripts/ext_skel_ng/php_function.php
index 49f6d06cf9..1b2005b78c 100644
--- a/scripts/ext_skel_ng/php_function.php
+++ b/scripts/ext_skel_ng/php_function.php
@@ -14,13 +14,60 @@
}
function parse_proto($proto) {
+ /* TODO
+ a 'real' parser is needed here (lex/yacc with PHP output anyone?)
+ to support stuff like default values
+ the current tokenizer is not clever enough for this ...
+
+ the grammer for a prototype would look like this: ?
+
+ proto: type name '(' param-list ')'
+
+ name: [A-Za-z_][A-Za-z0-9_]*
+
+ type: "void"
+ | typespec
+
+ typespec: typename
+ | typename '&'
+
+ typename: bool | boolean
+ | int | integer | long
+ | float | double | real
+ | string
+ | array
+ | object | object name
+ | resource | resource name
+ | mixed
+ | callback
+ | stream
+
+ param-list: void
+ | parameter
+ | parm-list ',' parameter
+
+ parameter: typespec name
+ | typespec name '=' default-value
+
+ default-value: "true" | "false" | "array()"
+ | numeric-value
+ | string
+
+ string: '"' character* '"'
+
+ number: ... the usual int, float, hex and octal stuff ...
+ */
+
// 'tokenize' it
+ $tokens=array();
+
+ // we collect valid C names as Strings, any other character for itself, blanks are skipped
+ // TODO: this does no longer work if we ever add default values ...
$len=strlen($proto);
$name="";
- $tokens=array();
for ($n=0;$n<$len;$n++) {
$char = $proto{$n};
- if (ereg("[a-zA-Z0-9_]",$char)) {
+ if (ctype_alpha($char) || $char == '_' || ($n && ctype_digit($char))) {
$name.=$char;
} else {
if ($name) $tokens[]=$name;