Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 3 Nächste Version anzeigen »

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 ...
  • Keine Stichwörter