PhpGrammar.16jul21.php
<?php
namespace Tlf\Lexer\Test;
class PhpGrammar_16Jul21 extends Grammar {
use Php\LanguageDirectives;
use Php\ClassDirectives;
use Php\ClassMemberDirectives;
use Php\BodyDirectives;
use Php\OtherDirectives;
protected $directives;
public $notin = [
'keyword'=>[
'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'
],
];
public function getNamespace(){return 'php';}
public function buildDirectives(){
$this->directives = array_merge(
$this->_language_directives,
$this->_body_directives,
$this->_class_directives,
$this->_class_member_directives,
$this->_other_directives,
);
}
public function onGrammarAdded($lexer){
$this->buildDirectives();
$lexer->addDirective($this->getDirectives(':php_open')['php_open']);
}
public function onLexerStart($lexer,$file,$token){
$lexer->addGrammar(new DocblockGrammar());
if ($file->type=='file'){
$file->set('namespace', '');
}
}
public function holdNamespaceName($lexer, $file, $token){
$prev = $lexer->previous('namespace.name');
if ($prev == null)$prev = [];
$prev[] = $token->buffer();
$lexer->setPrevious('namespace.name', $prev);
}
public function saveNamespace($lexer, $file, $token){
$namespace = $lexer->previous('namespace.name');
$namespace = implode('\\',$namespace);
$file->set('namespace.docblock', $lexer->unsetPrevious('docblock'));
$file->set('namespace', $namespace);
$lexer->setPrevious('namespace.name', $namespace);
}
public function handleClassDeclaration($lexer, $class, $token){
$class->set('declaration', $lexer->unsetPrevious('class.declaration'));
}
public function processDocBlock($lexer, $ast, $token){
$lexer->setPrevious('docblock', $token->buffer());
}
public function captureUseTrait($lexer, $ast, $token){
$ast->add('traits',$token->buffer());
}
public function processComment($lexer, $ast, $token){
$comment = trim($token->buffer());
$ast->add('comments', $comment);
$lexer->previous('comment', $comment);
}
public function appendToWhitespace($lexer, $ast, $token, $directive){
}
public function setPropertyDeclaration($lexer, $ast, $token, $directive){
$ast->set('declaration',
$lexer->unsetPrevious('modifier')
.$lexer->unsetPrevious('property.declaration')
);
}
public function storeMethodDefinition($lexer, $ast, $token, $directive){
$ast->set('definition',
$lexer->unsetPrevious('modifier')
.$lexer->unsetPrevious('method.definition')
);
$ast->set('arglist', $lexer->unsetPrevious('method.arglist') );
$name = $lexer->unsetPrevious('method.name');
$ast->set('name', $name);
$modifiers = $ast->get('modifiers');
$ast->set('modifiers', substr($modifiers,0, -strlen($name)));
}
}