cvs: pear /CodeGen_PECL/PECL/Tools Proto.php ProtoLexer.plex ProtoParser.y

From: 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()"; }

« previous php.pear.cvs (#42435) next »