Lexer (Brandbox/Lexer)
Dieses Codepaket erleichtert das Auswerten von komplexen Zeichenketten. Das Codepaket stellt selbst nur einen Funktionssatz sowie einige Symbole (Tokens) bereit, welcher durch eine Implementation genutzt werden kann.
Hintergrund
Ein Lexer (dt. lexikalischer Scanner) zerlegt eine Zeichenkette in vordefinierte Symbole (Tokens) welche in einer bestimmten Reihenfolge stehen müssen. Der Scanner selbst kann hierbei dynamisch auf verschiedene Symbolreihenfolgen reagieren. Ein Symbol kann bspw. ein einzelnes "="-Zeichen sein aber auch aus einer in Anführungszeichen eingeschlossenen Zeichenkette.
Beispiel
Der nachfolgende Code stellt einen Beispiel-Lexer dar, welcher eine Zeichenkette in die entsprechenden Symbole zerlegt, auswertet und das Ergebnis bereitstellt.
use Brandbox\Framework\Brandbox\Lexer;
class CustomLexer extends Lexer\LexerAbstract
{
public string $identifier;
public string|bool $parameter1;
public string|bool $parameter2;
protected function getApplicableTokens(): array
{
return [
Lexer\Lib\Token\CommaToken::class,
Lexer\Lib\Token\EqualToken::class,
Lexer\Lib\Token\BooleanToken::class,
Lexer\Lib\Token\IdentifierToken::class,
Lexer\Lib\Token\OpenParenthesisToken::class,
Lexer\Lib\Token\CloseParenthesisToken::class,
Lexer\Lib\Token\DoubleQuotedStringToken::class,
];
}
protected function parse(): void
{
$this->identifier = $this
->match(Lexer\Lib\Token\IdentifierToken::class)
->get()
;
$this->match(Lexer\Lib\Token\OpenParenthesisToken::class);
$next = $this->glimpse();
if($next instanceof Lexer\Lib\Token\DoubleQuotedStringToken) {
$this->parameter1 = $this
->match(Lexer\Lib\Token\DoubleQuotedStringToken:class)
->get()
;
} elseif($next instanceof Lexer\Lib\Token\BooleanToken) {
$this->parameter1 = $this
->match(Lexer\Lib\Token\BooleanToken:class)
->get()
;
}
$this->match(Lexer\Lib\Token\CommaToken::class);
$next = $this->glimpse();
if($next instanceof Lexer\Lib\Token\DoubleQuotedStringToken) {
$this->parameter2 = $this
->match(Lexer\Lib\Token\DoubleQuotedStringToken:class)
->get()
;
} elseif($next instanceof Lexer\Lib\Token\BooleanToken) {
$this->parameter2 = $this
->match(Lexer\Lib\Token\BooleanToken:class)
->get()
;
}
$this->match(Lexer\Lib\Token\CloseParenthesisToken::class);
}
}
$lexer = new CustomLexer();
$lexer->process('Something(false, "strange")');
// Inhalt von $lexer
// $lexer->identifier = 'Something'
// $lexer->parameter1 = false
// $lexer->parameter2 = 'strange'
$lexer->process('"Inkorrekt"(Identifikator, true)'); // LexerException: could not parse ...