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();