Commands.NamespaceTargets
$namespaceTargets = [ 'lexer'=>$this, 'token'=>$this->token, 'ast'=>$this->getHead(), ]; $grammarTargets = $this->grammars; $grammarTargets['this'] = $directive->_grammar ?? null;
Commands.SwitchCase
switch ($command){ /// // comands for debugging /// case "debug.die": case "die": var_dump($args); exit; break; case "debug.print": case "print": var_dump($args); break; /** * Run commands of another directive. Does not run 'match' by default * * @arg :directive.isn * @arg literal string 'match' to keep the match command from the inherited directive * * @example directive.inherit :varchars.start / case "directive.inherit": case "inherit": $arg2 = $args[1]??''; $parts = explode('.', $arg1); $name = $parts[0]; $isn = $parts[1]; $directives = $directive->_grammar->getDirectives($name); foreach ($directives as $d){ if ($arg2!=='match'){ unset($d->$isn['match']); } // print_r($d $this->processInstructions($d, $isn, $directiveList); if ($arg2==='match'&&isset($d->$isn['_matches'])){ $directive->$isn['_matches'] = $d->$isn['_matches']; } } echo "\n\033[0;32mContinue ".$directive->_name."\033[0m"; break; // // commands with non-namespaced shorthands // case "directive.start": case "start": $this->directiveStarted($directive); break; case "directive.stop": case "stop": $this->directiveStopped($directive); break; case "token.rewind": case "rewind": $token->rewind($arg1); break; case "token.forward": case "forward": $token->forward($arg1); break; /* * Halt execution of current directive (don't run its following instructions). Useful for preventing overrides from being executed */ case "directive.halt": case "halt": $this->haltInstructions(); break; case "halt.all": $this->haltAll(); break; // // namespaced commands // case "previous.append": if (!is_array($arg1))$arg1 = [$arg1]; foreach ($arg1 as $index=>$keyForPrevious){ $this->appendToPrevious($keyForPrevious, $token->buffer()); } break; case "previous.set": $value = $args[1] ?? $token->buffer(); if ($value ===true)$value = $token->buffer(); $this->setPrevious($arg1, $value); break; case "directive.stop_others": foreach ($directiveList['started'] as $started){ if ($started!=$directive){ $this->directiveStopped($started, $list); } } break; case "directive.pop": $arg1 = (int)$arg1; if ($arg1===0)echo "\n --no directives popped."; while ($arg1-- > 0){ $this->popDirectivesLayer(); } break;
//
// buffer commands
//
case "buffer.clear":
$token->clearBuffer();
break;
case "buffer.clearNext":
$amount = (int)$arg1;
$remove = 0;
while ($amount-->0){
if ($token->next())$remove++;
}
$token->setBuffer(substr($token->buffer(),0,-$remove));
break;
case "buffer.appendChar":
$token->setBuffer($token->buffer() . $arg1);
break;
//
// ast commands
//
case "ast.pop":
$this->popHead();
break;
case "ast.set":
if (isset($args[1])){
$value = $this->executeMethodString($args[1]);
} else $value = $token->buffer();
$this->getHead()->set($arg1, $value);
break;
/**
* Save the currrent buffer to the given key
* @arg key to push to
*/
case "ast.push":
$key = $arg1;
$toPush = $token->buffer();
$ast = $this->getHead();
$ast->add($key,$toPush);
break;
case "ast.append":
$key = $arg1;
if (isset($args[1])&&is_string($args[1])){
var_dump($args[1]);
$value = $this->executeMethodString($args[1]);
} else $value = $token->buffer();
$ast = $this->getHead();
$src = $ast->get($key);
$new = $src . $value;
$ast->set($key, $new);
break;
default:
throw new \Exception("\nAction '$command' not handled yet. Maybe it needs to be a callable. Prepend `this:` to call a method on your grammar.");
}
Commands.MethodMap
[ 'directive.then'=>'cmdThen', 'then'=>'cmdThen', 'then.pop'=>'cmdThenPop',
'match'=>'cmdMatch',
'buffer.match'=>'cmdMatch',
'buffer.notin'=>'cmdBuffer_notin',
'ast.new'=>'cmdAst_new',
];
DocBlock.onLexerStart
Called before any characters are added to the token
@usage Set placeholder values @param Tlf\Lexer $lexer the lexer @param Tlf\Lexer\Ast $ast The root ast. Usually a 'file' type ast with 'ext', 'name', and 'path' set @param Tlf\Lexer\Token $token a token with an empty buffer
ParsingJson
$json = '["Cool",["yes","please"],"okay"]'; $lexer = new \Tlf\Lexer(); // $lexer->debug = true; // $lexer->useCache = false; // useCache only matters when lexing a file $lexer->addGrammar($jsonGrammar = new \Tlf\Lexer\JsonGrammar());
//this is the root ast $ast = new \Tlf\Lexer\JsonAst("json"); //"json" is the type $ast->source = $json; //Not required, but I like keeping source in the ast root. $ast = $lexer->lexAst($ast, $json);
// $tree = $ast->getTree(); // not what we normally want with json $data = $ast->getJsonData(); // custom method on the JsonAst class
Internal.prompt_choose_function
# prompt_choose_function \
# "# bent [command]" \
# "run help" "help" "View all functions and extended help" \
# "run core save" "save" "Save & upload your project" \
# "run core upload" "upload" "upload your project (doesn't save first)" \
# "run core update" "update" "Download all changes" \
# "'" \
# "run core tag" "tag" "Create a numbered release of your project" \
# "run core revert" "revert" "Rollback to a previous save of your project" \
# "run core merge" "merge" "Merge current branch into another branch" \
# "run core check" "check" "Check the status of your project" \
# "run core url" "url" "Get special urls to git hosts" \
# "run core ignore" "ignore" "Download a .gitignore file from Github's gitignore repo" \
# \
# ;
Test.Doc.LexString
$lexer = new \Tlf\Lexer(); $docGrammar = new \Tlf\Lexer\DocblockGrammar(); $lexer->addGrammar($docGrammar); $lexer->addDirective($docGrammar->getDirectives(':/')['/']); $str = "/** I am docblock */"; $ast = $lexer->lex($str);
$tree = $ast->getTree(); $actual = $tree['docblock'][0]; $expect = [ 'type'=>'docblock', 'description'=>'I am docblock', ];
Test.Doc.LexAst
$lexer = new \Tlf\Lexer(); $phpGrammar = new \Tlf\Lexer\PhpGrammar(); $lexer->addGrammar($phpGrammar);
// set up the ast $ast = new \Tlf\Lexer\Ast('code'); $ast->set ('language', 'php'); $code = '<?php class Abc extends Alphabet {}'; $ast->set('src', $code);
$ast = $lexer->lex($code, $ast); $actual = $ast->getTree(); $expect = [ 'type'=>'code', 'language'=>'php', 'src'=>$code, 'class'=>[ 0=>[ 'type'=>'class', 'docblock'=>'', 'namespace'=>'', 'name'=>'Abc', 'declaration'=>'class Abc extends Alphabet ', ], ], ];
Test.Doc.LexFile
$lexer = new \Tlf\Lexer(); $lexer->useCache = false; // cache is disabled only for testing $lexer->addGrammar($phpGrammar = new \Tlf\Lexer\PhpGrammar());
$ast = $lexer->lexFile(dirname(DIR).'/php/SampleClass.php');
// An array detailing the file $tree = $ast->getTree();