support/parser/generate-type-parser.php (63 lines of code) (raw):
#!/usr/bin/env php
<?php
require_once dirname(__FILE__).'/../../scripts/__init_script__.php';
$terminals = array(
'|',
'<',
'>',
'(',
')',
',',
'k',
'map',
'list',
'?',
'opt',
'cm',
);
$rules = array(
'start' => 'maybe_optional',
'maybe_optional' => array(
'yes' => 'opt maybe_comment',
'no' => 'maybe_comment',
),
'maybe_comment' => array(
'yes' => 'type comment',
'no' => 'type',
),
'comment' => '( comment_text )',
'comment_text' => array(
'comment_text cm',
'cm',
),
'type' => array(
'yes' => 'some_type ?',
'no' => 'some_type',
),
'some_type' => array(
'or_type',
'not_or_type',
),
'or_type' => array(
'or_type | not_or_type',
'not_or_type | not_or_type',
),
'not_or_type' => array(
'basic_type',
'map_type',
'list_type',
),
'basic_type' => array(
'k',
),
'map_type' => array(
'map < type , type >',
),
'list_type' => array(
'list < type >',
),
);
$parser = id(new PhutilParserGenerator())
->setTerminals($terminals)
->setRules($rules)
->processGrammar();
echo $parser->generateParserFunction('phutil_type_spec_parser')."\n";