cvs: pear /CodeGen_PECL/PECL/Tools Proto.php ProtoLexer.plex ProtoParser.y
| From: | Hartmut Holzgraefe | Date: | Sat, 07 Oct 2006 01:22:22 +0000 |
| Subject: | cvs: pear /CodeGen_PECL/PECL/Tools Proto.php ProtoLexer.plex ProtoParser.y | ||
| Groups: | php.pear.cvs | ||
| Request: | Send a blank email to pear-cvs+get-42435@lists.php.net to get a copy of this message | ||
hholzgra Sat Oct 7 01:22:22 2006 UTC
Added files:
/pear/CodeGen_PECL/PECL/Tools Proto.php ProtoLexer.plex
ProtoParser.y
Log:
Experimental: use PHP_LexerGenerator and PHP_ParserGenerator for proto
parsing instead of hand craftet parser code
http://cvs.php.net/viewvc.cgi/pear/CodeGen_PECL/PECL/Tools/Proto.php?view=markup&rev=1.1
Index: pear/CodeGen_PECL/PECL/Tools/Proto.php
+++ pear/CodeGen_PECL/PECL/Tools/Proto.php
<?php
require_once "ProtoLexer.php";
require_once "ProtoParser.php";
$lex = new CodeGen_PECL_Tools_ProtoLexer("boolx foobar(int foo, string bar);");
$parser = new CodeGen_PECL_Tools_ProtoParser();
while ($lex->yylex()) {
printf("LEX: %d:%s\n", $lex->token, $lex->value);
$parser->doParse($lex->token, $lex->value);
}
$parser->doParse(0, 0);
$parser->dump();
?>
http://cvs.php.net/viewvc.cgi/pear/CodeGen_PECL/PECL/Tools/ProtoLexer.plex?view=markup&rev=1.1
Index: pear/CodeGen_PECL/PECL/Tools/ProtoLexer.plex
+++ pear/CodeGen_PECL/PECL/Tools/ProtoLexer.plex
<?php
class CodeGen_PECL_Tools_ProtoLexer
{
private $data;
public $token;
public $value;
private $line;
private $count;
function __construct($data)
{
$this->data = $data;
$this->count = 0;
$this->line = 1;
}
/*!lex2php
%input $this->data
%counter $this->count
%token $this->token
%value $this->value
%line $this->line
whitespace = /[ \t\n]+/
par_open = /\(/
par_close = /\)/
eq = /=/
comma = /,/
semicolon = /;/
void = /void/
bool = /bool(ean)?/
int = /int(eger)?|long/
float = /float|double/
string = /string/
array = /array/
class = /class|object/
resource = /resource/
mixed = /mixed/
callback = /callback/
stream = /stream/
ellipse = /\.\.\./
true = /true/
false = /false/
null = /null/
numval = /[0-9]+|0x[0-9a-fA-F]+/
strval = /"[^"]*"|'[^']*'/
name = /[_a-zA-Z][_a-zA-Z0-9]+/
*/
/*!lex2php
whitespace {
return false;
}
par_open {
$this->token = CodeGen_PECL_Tools_ProtoParser::PAR_OPEN;
}
par_close {
$this->token = CodeGen_PECL_Tools_ProtoParser::PAR_CLOSE;
}
eq {
$this->token = CodeGen_PECL_Tools_ProtoParser::EQ;
}
comma {
$this->token = CodeGen_PECL_Tools_ProtoParser::COMMA;
}
semicolon {
$this->token = CodeGen_PECL_Tools_ProtoParser::SEMICOLON;
}
void {
$this->token = CodeGen_PECL_Tools_ProtoParser::VOID;
}
bool {
$this->token = CodeGen_PECL_Tools_ProtoParser::BOOL;
}
int {
$this->token = CodeGen_PECL_Tools_ProtoParser::INT;
}
float {
$this->token = CodeGen_PECL_Tools_ProtoParser::FLOAT;
}
string {
$this->token = CodeGen_PECL_Tools_ProtoParser::STRING;
}
array {
$this->token = CodeGen_PECL_Tools_ProtoParser::ARRAY_;
}
class {
$this->token = CodeGen_PECL_Tools_ProtoParser::CLASS_;
}
resource {
$this->token = CodeGen_PECL_Tools_ProtoParser::RESOURCE;
}
mixed {
$this->token = CodeGen_PECL_Tools_ProtoParser::MIXED;
}
callback {
$this->token = CodeGen_PECL_Tools_ProtoParser::CALLBACK;
}
stream {
$this->token = CodeGen_PECL_Tools_ProtoParser::STREAM;
}
ellipse {
$this->token = CodeGen_PECL_Tools_ProtoParser::ELLIPSE;
}
true {
$this->token = CodeGen_PECL_Tools_ProtoParser::TRUE_;
}
false {
$this->token = CodeGen_PECL_Tools_ProtoParser::FALSE_;
}
null {
$this->token = CodeGen_PECL_Tools_ProtoParser::NULL_;
}
name {
$this->token = CodeGen_PECL_Tools_ProtoParser::NAME;
}
numval {
$this->token = CodeGen_PECL_Tools_ProtoParser::NUMVAL;
}
strval {
$this->token = CodeGen_PECL_Tools_ProtoParser::STRVAL;
}
*/
}
http://cvs.php.net/viewvc.cgi/pear/CodeGen_PECL/PECL/Tools/ProtoParser.y?view=markup&rev=1.1
Index: pear/CodeGen_PECL/PECL/Tools/ProtoParser.y
+++ pear/CodeGen_PECL/PECL/Tools/ProtoParser.y
%name CodeGen_PECL_Tools_ProtoParser_
%declare_class {class CodeGen_PECL_Tools_ProtoParser}
%include_class {
protected $name = "";
protected $varargs = false;
protected $returns = array("type" => "void");
protected $params = array();
protected $optional = 0;
protected $hasRefArgs = false;
function dump()
{
echo "Function: ".$this->name."\n";
echo "Returns: "; var_dump($this->returns);
echo "Params: "; var_dump($this->params);
}
}
proto_line ::= proto.
proto_line ::= proto SEMICOLON.
proto ::= typespec(A) NAME(B) PAR_OPEN param_spec PAR_CLOSE. {
$this->returns = A;
$this->name = B;
}
typespec(A) ::= VOID. { A = array("type" => "void"); }
typespec(A) ::= typename(B). { A = B; }
typespec(A) ::= typename(B) AMPERSAND. { A = B; A["byref"] = true; }
typename(A) ::= BOOL. { A = array("type" => "bool"); }
typename(A) ::= INT. { A = array("type" => "int"); }
typename(A) ::= FLOAT. { A = array("type" => "float"); }
typename(A) ::= STRING. { A = array("type" => "string"); }
typename(A) ::= ARRAY_. { A = array("type" => "array"); }
typename(A) ::= CLASS_ NAME(B). { A = array("type" => "class ",
"subtype" => B); }
typename(A) ::= RESOURCE NAME. { A = array("type" => "resource ",
"subtype" => B); }
typename(A) ::= MIXED. { A = array("type" => "mixed"); }
typename(A) ::= CALLBACK. { A = array("type" => "callback"); }
typename(A) ::= STREAM. { A = array("type" => "stream"); }
param_spec ::= param_list.
param_spec ::= ELLIPSE. { $this->varargs = true; }
param_spec ::= VOID.
param_list ::= param_list COMMA ELLIPSE. { $this->varargs = true; }
param_list ::= param_list COMMA param.
param_list ::= param.
param_list ::= .
param ::= typename(A) NAME(B). {
$param = A;
$param["name"] = B;
$this->params[] = $param;
}
param ::= typename(A) NAME(B) EQ default(C). {
$param = A;
$param["name"] = B;
$param["default"] = C;
$this->params[] = $param;
}
default(A) ::= TRUE_. { A = "true"; }
default(A) ::= FALSE_. { A = "false"; }
default(A) ::= NULL_. { A = "null"; }
default(A) ::= NUMVAL(B). { A = B; }
default(A) ::= STRVAL(B). { A = '"'.B.'"'; }
default(A) ::= ARRAY_ PAR_OPEN PAR_CLOSE. { A = "array()"; }