mrsuh / php-bison-skeleton
PHP skeleton for Bison
Installs: 8 978
Dependents: 1
Suggesters: 0
Security: 0
Stars: 38
Watchers: 3
Forks: 2
Open Issues: 0
Language:M4
pkg:composer/mrsuh/php-bison-skeleton
Requires
- php: >=7.4
 
Requires (Dev)
- phpunit/phpunit: ^9.6
 - symfony/process: ^5.4
 
This package is auto-updated.
Last update: 2025-10-23 11:42:17 UTC
README
A set of Bison skeleton files that can be used to generate a Bison parser written in PHP.
Requirements:
- PHP >= 7.4
 - Bison >= 3.8
 
Installation
composer require --dev mrsuh/php-bison-skeleton
Usage
bison -S vendor/mrsuh/php-bison-skeleton/src/php-skel.m4 -o parser.php grammar.y
Posts
- PHP Skeleton for Bison
 - AST parser with PHP and Bison
 - Nginx parser with PHP and Bison
 - JSON parser with PHP and Bison
 
Docker
Example
grammar.y
%define api.parser.class {Parser}
%token T_NUMBER
%left '-' '+'
%%
start:
  expression                       { printf("%d\n", $1); }
;
expression:
  T_NUMBER                         { $$ = $1; }
| expression '+' expression        { $$ = $1 + $3;  }
| expression '-' expression        { $$ = $1 - $3;  }
;
%%
class Lexer implements LexerInterface {
    private array $words;
    private int   $index = 0;
    private int   $value = 0;
    public function __construct($resource)
    {
        $this->words = explode(' ', trim(fgets($resource)));
    }
    public function yyerror(string $message): void
    {
        printf("%s\n", $message);
    }
    public function getLVal()
    {
        return $this->value;
    }
    public function yylex(): int
    {
        if ($this->index >= count($this->words)) {
            return LexerInterface::YYEOF;
        }
        $word = $this->words[$this->index++];
        if (is_numeric($word)) {
            $this->value = (int)$word;
            return LexerInterface::T_NUMBER;
        }
        return ord($word);
    }
}
$lexer  = new Lexer(STDIN);
$parser = new Parser($lexer);
if (!$parser->parse()) {
    exit(1);
}
bison -S vendor/mrsuh/php-bison-skeleton/src/php-skel.m4 -o parser.php grammar.y
php parser.php <<< "1 + 2" 3
See more examples in the folder
Tests
composer test